1

我正在编写一个需要用户登录的 UI。登录本身最多可能需要 10 秒。登录后,对下载和填充 TreeView 的函数进行了长时间调用。我尝试使用glib.timeout_add()as 在调用登录名和函数时不锁定 UI,populatelist()但 gtk.main() 仍将其锁定。

def connect(self, widget, data):
    self.debug("Logging in")
    glib.timeout_add(500, self.login)
    self.debug("Logged in")

def login(self):
    self.debug("Starting self.gm.doLogin")
    logged_in = self.gm.doLogin(self.email, self.password)
    self.debug("Finsished self.gm.doLogin")
    if self.gm.logged_in:
        if self.connect_button.get_label() == "Connecting":
            self.debug("Getting SongWin")
            glib.timeout_add(500, self.populateSongWin)
            self.debug("Getting playLists")
            glib.timeout_add(500, self.populatePlaylists)
            self.action = "Getting songs"
            self.status_label.set_label("Status: %s; Songs: %s; Playlists: %s" %\
                                        (self.gm.logged_in, 
                                         len(self.gm.library),
                                         len(self.gm.playlists)))
            self.connect_button.set_label("Disconnect")
            self.connect_button.set_sensitive(True)
    self.action = "None"
    return False

我知道这以某种方式起作用,因为我可以看到:

DEBUG: Logging in
DEBUG: Logged in
DEBUG: Starting self.gm.doLogin

谁能告诉我我做错了什么?本质上,应用程序需要按以下顺序运行:

  1. self.gm.doLogin()
  2. self.populateSongWin()
  3. self.populatePlaylists()

这三个都很耗时,需要按顺序运行,并且不会阻塞 UI。

4

1 回答 1

3

看起来应用程序被阻止了,但它正在处理事件。其中一个事件必须终止循环。您可以在 Wikipedia中查看事件循环背后的想法。

不过,在您的代码中,您使用的是局部变量来获取登录状态,但您使用的是实例变量来验证状态。

def login(self):
    self.debug("Starting self.gm.doLogin")
    logged_in = self.gm.doLogin(self.email, self.password)
    self.debug("Finsished self.gm.doLogin")
    if self.gm.logged_in:                                   <=
        [...]

而不是self.gm.logged_in你应该在语句logged_in的条件中使用。if

于 2012-10-17T07:35:26.763 回答