点击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()
这是一个非常简单的图形界面,用于登录MEGA并获取关于你账户的信息(比如上传的文件等等)。问题是,当我点击“登录”时,界面会卡住,直到所有信息都被获取完。你能告诉我在这个程序中我做错了什么吗?
提前感谢你的回答。
1 个回答
1
出现这种情况的原因是,界面(UI)只有在你让控制权返回到主循环时才会更新。当你的 test
回调被调用时,主循环会执行这个回调,只有等这个回调执行完毕,控制权才会返回到主循环,这样界面才能继续更新。所以在回调里你应该只做一些短时间的操作。要让长时间运行的函数正常工作,有几种方法:
如果Mega有异步版本的函数,你应该使用那些,并在回调中更新相关信息。否则,你就需要在一个线程中执行Mega的函数。如果你使用线程,要小心只在主线程中更新UI。像很多UI工具包一样,GTK+的UI函数只能在主线程中调用,否则会出问题。