我正在用 Python 中的 Tkinter 构建一个 GUI,但我在使用单选按钮时遇到了问题。我在 LabelFrame 小部件中有两个单选按钮,我正在使用 StringVar 来跟踪所选值。但是,当我运行该程序时,两个单选按钮最初都未选中,但几秒钟后都被选中。此外,对所选值的更改并不总是反映在 GUI 中。
这是我的代码:
import tkinter as tk
class MenuSettings:
def __init__(self, parent, settings):
window = tk.Toplevel(parent)
window.title("settings")
database_frame = tk.LabelFrame(
window, text="choose drive: ", font=("Arial", 12))
database_frame.pack(fill=tk.X, padx=10, pady=10)
database_var = tk.StringVar(value=settings.db_path)
database_radio_g = tk.Radiobutton(
database_frame, text="G:", value="PATH_G", variable=database_var,
font=("Arial", 12))
database_radio_g.pack(side="left", padx=10)
database_radio_server = tk.Radiobutton(
database_frame, text="Server", value="PATH_SERVER", variable=database_var,
font=("Arial", 12))
database_radio_server.pack(side="left", padx=10)
#-----------------------------------------------------------------------------
# following code is necessary
#-----------------------------------------------------------------------------
#def on_database_var_changed(*args):
# print('database_var changed:', database_var.get())
#database_var.trace('w', on_database_var_changed)
from wotan.CLS import cls
settings = cls.Settings.getInstance()
class Application(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.title("Application")
self.configure(background='black')
self._show_menu_settings()
def _show_menu_settings(self):
settings_window=MenuSettings(self, settings)
def main():
app = Application()
app.mainloop()
if __name__ == '__main__':
main()
settings
是一个单例类,用于从本地存储的文本文件中读取一些变量。
跟踪语句包括。函数在类中被注释掉MenuSettings
我尝试了几种方法,例如设置单选按钮的值选项,删除代码的其他部分以隔离问题,使用 window.update() 和 window.update_idletasks(),但似乎没有任何效果。
我找到的唯一解决方案是添加一个带有打印 StringVar 函数的跟踪,这对于 App 来说不是一个理想的解决方案。 有人对如何解决这个问题有什么建议吗?
您需要在
database_var
(在MenuSettings
)和settings_window
(在Application
)上使用实例变量以避免垃圾收集:
class MenuSettings:
def __init__(self, parent, settings):
...
# use instance variable
self.database_var = tk.StringVar(value=settings.db_path)
database_radio_g = tk.Radiobutton(
database_frame, text="G:", value="PATH_G", variable=self.database_var,
font=("Arial", 12))
database_radio_g.pack(side="left", padx=10)
database_radio_server = tk.Radiobutton(
database_frame, text="Server", value="PATH_SERVER", variable=self.database_var,
font=("Arial", 12))
database_radio_server.pack(side="left", padx=10)
...
class Application(tk.Tk):
...
def _show_menu_settings(self):
# use instance variable
self.settings_window = MenuSettings(self, settings)
...