在我的游戏中,我有两个模块,island.py将岛屿加载到我的游戏中,第二个模块是gui.py,它在游戏开始前处理gui小部件。我的问题是如何将进度值从island.py模块发送到在gui.py模块中创建的进度条编辑:还与加载屏幕的实例一起访问其中的进度条并更改其值。
模块island.py
def __iter__(self):
total = float(len(self.ground_map))
import game.gui
for i in self.get_coordinates():
yield i
global count
count+=1
progress = (count/total) * 100
game.gui.Gui.set_progress(progress)
global count
count = 0
在gui.py
def show_loading_screen(self):
self._switch_current_widget('loadingscreen', center=True, show=True) # Creates the loading screen and its associated widgets, except the progress bar.
@staticmethod
def set_progress(progress):
# Now I have the progress values, and it will be updated automatically... how can I pass it to the progress bar widget?
# I need to create the progress bar widget here, but to do that I need to have the self instance to give me the current screen that I will create the progress bar for **AND HERE IS THE PROBLEM!!**
def update_loading_screen(progress):
"""updates the widget."""
**self,current**.findChild(name="progressBar")._set_progress(progress)
update_loading_screen(progress)
我如何使这个update_loading_screen功能?
扩展rocksport的答案…我是这样做的
class GUI:
def __init__(self):
GUI.self = self
@staticmethod
def set_progressbar():
print "set progress bar"
print GUI.self
g = GUI()
g.set_progressbar()
我会用不同的方式来处理这个问题。我会去找pyDispatcher,用它你可以定义qt调用的"插槽和信号",或者你可能只知道"信号",而不是操作系统的SIGNAL。这些信号,当"发出"或执行一系列或一组函数时,您已附加到信号上。插槽是被执行的函数,调度程序保存一个字典,其中包含对插槽的弱引用,并使用你在信号中发出的参数调用它们。
查看pydispatch的示例,了解它们是如何组合在一起的。
,但你会做这样的事情:dispatcher.connect(reciever, signal, sender)
或connect(game.gui.Gui.set_progress, 'update_progress', island.Class)
,然后在__iter__
中,你会发送一个像send('update_progress', sender=island.Class, progress=progress)
这样的信号,这将使用kwargs progress=progress
调用update_progress。通过这种方式,您可以将更新进度从静态方法更改为直接更新gui。
如果我理解正确的话,您正在调用静态方法,因此您无法访问self。我假设你只有一个GUI类的实例,你可以设置
GUI.self = self
在GUI.__init__ 静态方法可以访问GUI.self。
进一步阅读请参见http://en.wikipedia.org/wiki/Singleton_pattern和http://code.activestate.com/recipes/52558-the-singleton-pattern-implemented-with-python/