Tkinter 单选按钮在顶层窗口中无法正常工作

问题描述 投票:0回答:1

我正在用 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 来说不是一个理想的解决方案。 有人对如何解决这个问题有什么建议吗?

python-3.x tkinter radio-button toplevel
1个回答
0
投票

您需要在

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)
...
© www.soinside.com 2019 - 2024. All rights reserved.