首页 > 解决方案 > 函数中的 Ratiobutton 默认值

问题描述

我想在我的 gui 上添加一个具有默认值的单选按钮(在“数字”和“模拟”之间切换)。以下代码显示默认值 = 按钮上显示的“数字”。

import tkinter as tk

root = tk.Tk()
tk.Label(root, text = 'MPD').grid(row = 1, column = 15)
MPDmode = tk.Frame(root)
MPDmode.grid(row = 2, column = 15)
MPDmode_var = tk.StringVar(value = 'digital')
MPDdigital = tk.Radiobutton(MPDmode, text = 'Digital', variable = MPDmode_var, indicatoron = False, value = 'digital', width = 8)
MPDanalog = tk.Radiobutton(MPDmode, text = 'Analog', variable = MPDmode_var, indicatoron = False, value = 'analog', width = 8)
MPDdigital.grid(row = 0)
MPDanalog.grid(row = 1)

root.mainloop()

但是,如果我在函数中定义内容,则无法显示默认值。IE:

import tkinter as tk

def start():
    tk.Label(root, text = 'MPD').grid(row = 1, column = 15)
    MPDmode = tk.Frame(root)
    MPDmode.grid(row = 2, column = 15)
    MPDmode_var = tk.StringVar(value = 'digital')
    MPDdigital = tk.Radiobutton(MPDmode, text = 'Digital', variable = MPDmode_var, indicatoron = False, value = 'digital', width = 8)
    MPDanalog = tk.Radiobutton(MPDmode, text = 'Analog', variable = MPDmode_var, indicatoron = False, value = 'analog', width = 8)
    MPDdigital.grid(row = 0)
    MPDanalog.grid(row = 1)

root = tk.Tk()
start()
root.mainloop()

因为我想让我的项目开发更加结构化,所以我想把内容放在一个函数中,在代码中的不同位置调用它来构建GUI。我可以知道我怎样才能做到这一点。

标签: pythontkinter

解决方案


在函数中创建时,它看起来像StringVar得到了 GCed。您可以将其创建StringVar为全局变量:

def start():
    global MPDmode_var
    ...
    MPDmode_var = tk.StringVar(value = 'digital')

但是如果你正在寻找更好的结构,你可以使用一个类来代替:

import tkinter as tk

class Start(tk.Frame):
    def __init__(self,master=None,**kwargs):
        super().__init__(master,**kwargs)
        tk.Label(master, text = 'MPD').grid(row = 1, column = 15)
        self.grid(row = 2, column = 15)
        self.MPDmode_var = tk.StringVar(value='digital')
        MPDdigital = tk.Radiobutton(self, text = 'Digital', variable = self.MPDmode_var,
                                    indicatoron = False, value = 'digital', width = 8)
        MPDanalog = tk.Radiobutton(self, text = 'Analog', variable = self.MPDmode_var,
                                   indicatoron = False, value = 'analog', width = 8)
        MPDdigital.grid(row = 0)
        MPDanalog.grid(row = 1)

root = tk.Tk()
Start(root)
root.mainloop()

推荐阅读