如何在不等待 Tkinter 菜单命令功能完成的情况下更新 Tkinter 标签文本?
How do I get a Tkinter label text to update without waiting for the Tkinter menu command function to finish?
我正在编写一个练习 GUI 应用程序,帮助 ADB 管理 Android 个应用程序。
但我 运行 遇到了一个问题,即在从 tk.Menu
调用的 uninstall_package
函数完成之前,状态栏不会更新。
没有显示第一个 self.status_bar.text.set
,但显示了最后一个。我已经测试过在第一个 self.status_bar.text.set
之后用 time.wait()
替换终端函数,但这没有用。
我遇到了这个相关问题,但没有帮助解决它。
这是脚本。我已将其最小化,仅包含与该问题相关的主要部分。
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('640x480')
self.menu_bar = MenuBar(self)
self.status_bar = StatusBar(self)
self.tab = Tab(self)
def uninstall_package(self):
if self.tab.get_selected_name() == 'Third Party':
# com.company.app
package = self.tab.third_party.get_selected_items()[0]
answer = messagebox.askyesno(
title='Confirm',
message='Uninstall package:\n{}'.format(package)
)
if not answer:
return
self.status_bar.text.set('Uninstalling {}...'.format(package))
# function halts until the terminal process has finished
process = terminal('adb uninstall {}'.format(package))
if process.stdout:
self.status_bar.text.set('Success')
else:
messagebox.showerror('An error occurred.')
# other functions...
class MenuBar(tk.Menu):
def __init__(self, master):
super().__init__(master)
action_menu = tk.Menu(self, tearoff=0)
action_menu.add_command(label='Uninstall Selected Package', command=master.uninstall_package)
self.add_cascade(label='Action', menu=action_menu)
master.config(menu=self)
class StatusBar(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.text = tk.StringVar()
self.text.set('Ready')
label = tk.Label(self, anchor='w', bd=1, relief=tk.SUNKEN, textvariable=self.text)
label.pack(fill='x')
self.pack(side='bottom', fill='x')
在设置状态栏文本后试试这个:
tk.update_idletasks()
我正在编写一个练习 GUI 应用程序,帮助 ADB 管理 Android 个应用程序。
但我 运行 遇到了一个问题,即在从 tk.Menu
调用的 uninstall_package
函数完成之前,状态栏不会更新。
没有显示第一个 self.status_bar.text.set
,但显示了最后一个。我已经测试过在第一个 self.status_bar.text.set
之后用 time.wait()
替换终端函数,但这没有用。
我遇到了这个相关问题,但没有帮助解决它。
这是脚本。我已将其最小化,仅包含与该问题相关的主要部分。
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('640x480')
self.menu_bar = MenuBar(self)
self.status_bar = StatusBar(self)
self.tab = Tab(self)
def uninstall_package(self):
if self.tab.get_selected_name() == 'Third Party':
# com.company.app
package = self.tab.third_party.get_selected_items()[0]
answer = messagebox.askyesno(
title='Confirm',
message='Uninstall package:\n{}'.format(package)
)
if not answer:
return
self.status_bar.text.set('Uninstalling {}...'.format(package))
# function halts until the terminal process has finished
process = terminal('adb uninstall {}'.format(package))
if process.stdout:
self.status_bar.text.set('Success')
else:
messagebox.showerror('An error occurred.')
# other functions...
class MenuBar(tk.Menu):
def __init__(self, master):
super().__init__(master)
action_menu = tk.Menu(self, tearoff=0)
action_menu.add_command(label='Uninstall Selected Package', command=master.uninstall_package)
self.add_cascade(label='Action', menu=action_menu)
master.config(menu=self)
class StatusBar(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.text = tk.StringVar()
self.text.set('Ready')
label = tk.Label(self, anchor='w', bd=1, relief=tk.SUNKEN, textvariable=self.text)
label.pack(fill='x')
self.pack(side='bottom', fill='x')
在设置状态栏文本后试试这个:
tk.update_idletasks()