0

これは繰り返し発生する質問かもしれませんが、その問題に対する他の回答では意味がわかりません。
まず第一に、ここに私のコードがあります(構文の強調表示が必要な場合):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にログインし、アカウントに関する情報(アップロードされたファイルなど)を取得するための非常にシンプルなGUIです。実際、「ログイン」をクリックすると、すべての情報が取得されるまでGUIがフリーズします。このプログラムで私が間違っていることを教えてください。

よろしくお願いします。

4

1 に答える 1

1

これが発生する理由は、コントロールをメインループに戻した場合にのみUIが更新されるためです。コールバックが呼び出されると、testメインループがコールバックを実行し、それが完了すると、制御がメインループに戻り、UIが更新を続行できます。コールバックでは短期間のことだけを行う必要があります。長時間実行される関数を機能させる方法はいくつかあります。

Megaに非同期バージョンの関数がある場合は、それらを使用して、コールバックで詳細を更新する必要があります。それ以外の場合は、スレッドでMega関数を実行する必要があります。スレッドを使用する場合は、メインスレッドのUIのみを更新するように注意する必要があります。多くのUIツールキットと同様に、GTK + UI関数はメインスレッドからのみ呼び出すことができます。そうしないと、機能しなくなります。

于 2013-02-25T22:17:04.997 に答える