在PyGtk中单击按钮时GUI将冻结



我知道这可能是一个反复出现的问题,但我不明白这个问题的其他答案
首先,这里是我的代码(如果你想突出显示语法(:http://pastebin.com/9uJah8t2

#!/usr/bin/python2.7
from mega import Mega
import pygtk
import gtk
import glib
class HelloWorld:
#def onSuccess(self, widget, data):

def test(self, widget, data):
    email = self.login.get_text()
    password = self.password.get_text()
    mega = Mega()
    m =  mega.login(email, password)
    details = m.get_user()
    print(details)
    #get account files
    files = m.get_files()
    print(files)
def hello(self, widget, data=None):
    print "Hello World"
def delete_event(self, widget, event, data=None):
    return False
def destroy(self, widget, data=None):
    gtk.main_quit()
def __init__(self):
    # Window Settings
    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    self.window.set_title("Mega Connector") 
    self.window.connect("delete_event", self.delete_event)
    self.window.connect("destroy", self.destroy)
    self.window.set_border_width(5)
    self.window.set_resizable(False)
    # Vbox
    self.vbox = gtk.VBox(True, 0)
    # Login
    self.hboxlogin = gtk.HBox(True, 0)
    self.labellogin = gtk.Label("Login")
    self.hboxlogin.pack_start(self.labellogin, True, True, 0)
    self.labellogin.show()
    self.login = gtk.Entry(0)
    self.hboxlogin.pack_start(self.login, True, True, 0)
    self.login.show()
    self.hboxlogin.show()
    self.vbox.pack_start(self.hboxlogin, True, True, 0)
    # Password
    self.hboxpassword = gtk.HBox(True, 0)
    self.labelpassword = gtk.Label("Password")
    self.hboxpassword.pack_start(self.labelpassword, True, True, 0)
    self.labelpassword.show()
    self.password = gtk.Entry(0)
    self.password.set_visibility(False)
    self.hboxpassword.pack_start(self.password, True, True, 0)
    self.password.show()
    self.hboxpassword.show()
    self.vbox.pack_start(self.hboxpassword, True, True, 0)
    # Button
    self.button = gtk.Button("Connect")
    self.button.connect("clicked", self.test, None)
    self.vbox.pack_start(self.button, True, True, 0)
    self.button.show()
    self.window.add(self.vbox)
    self.vbox.show()
    self.window.show()
def main(self):
    gtk.main()
if __name__ == "__main__":
    hello = HelloWorld()
    hello.main()

这是一个非常简单的GUI,用于登录MEGA并检索有关您帐户的信息(如上传的文件和内容(。事实上,当我点击"登录"时,GUI会冻结,直到检索到所有信息。你能告诉我我在这个节目中做错了什么吗?

提前感谢您的回答。

之所以会发生这种情况,是因为只有当您让控件返回到主循环时,UI才会更新。当调用test回调时,主循环运行回调,只有当它完成时,控制才会返回到主循环,UI才能继续更新。您应该只在回调中执行短时间的操作。有几种方法可以使长期运行的功能发挥作用:

如果Mega有异步版本的函数,您应该使用这些函数并在回调中更新详细信息。否则,您将需要在线程中执行Mega函数。如果你确实使用了一个线程,你应该小心,你只更新主线程上的UI。像许多UI工具包一样,GTK+UI函数只能从主线程调用,否则就会中断。

相关内容

  • 没有找到相关文章

最新更新