簡體   English   中英

單擊PyGtk中的按鈕時,GUI凍結

[英]GUI Freezes when clicking a button in PyGtk

我知道這可能是一個反復出現的問題,但是我對該問題的其他答案沒有理解。
首先,這是我的代碼(如果您想突出顯示語法): 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函數只能從主線程調用,否則它們會中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM