是否可以直接从存储的tkinter小部件中引用变量?

时间:2020-08-12 10:16:41

标签: python tkinter

这里是堆栈的新成员,正在为我的一个小型Python项目遇到的问题寻求帮助。我目前正在尝试使用tkinter-library创建一个GUI,该库能够根据用户的意愿动态添加(然后删除)新字段。我在读取附加到单选按钮窗口小部件的变量的状态时遇到问题,因为我不一定直接访问变量本身,而只能直接访问该窗口小部件。

为了更好地解释我的情况,我将包含我的代码。下面是该项目的基类,详细介绍了窗口对象的创建: (请注意,我是Python的新手,所以请原谅任何较差或不理想的Python语法!)

import tkinter as tk

class newWindow():

    frames = []     # list of user-added frames
    yPos = 1        # variable to count vertical positioning

    def __init__(self):
        self.window = tk.Tk()
        mainFrame = tk.Frame(self.window)
        fieldButton = tk.Button(mainFrame, text='+', command=self.addFrame)
        fieldButton.grid(row=0, column=0)
        checkButton = tk.Button(mainFrame, text='check', command=self.check)
        checkButton.grid(row=0, column=1)
        mainFrame.grid(row=0, column=0)
        self.window.mainloop()

在主窗口中创建的“ fieldButton”用于动态创建包含一对单选按钮的字段,每个单选按钮都链接到相同的整数变量。 “ checkButton”应检查每个字段中链接到单选按钮的变量的状态。

以下代码片段是用于创建新字段的函数的定义。将所有元素打包到一个框架中,并将整个框架存储为类变量“ frames”的成员。整数变量“ rbVar”是为每个新帧本地定义的,是我以后要引用的变量:

    def addFrame(self):
        newFrame = tk.Frame(self.window)
        rbVar = tk.IntVar(newFrame, 0)
        rb1 = tk.Radiobutton(newFrame, text='RB_L', variable=rbVar, value=1)
        rb1.grid(row=0, column=0)
        rb2 = tk.Radiobutton(newFrame, text='RB_R', variable=rbVar, value=2)
        rb2.grid(row=0, column=1)
        newFrame.grid(row=self.yPos, sticky='ew')
        self.frames.append(newFrame)    # store frame for later reference
        self.yPos += 1

最后,应该使用“检查”功能简单地检索属于每个帧的变量状态(在这里,为了示例而简单地将其打印出来)

    def check(self):
        for unit in self.frames:
            info = unit.winfo_children()       # gather the widget info belonging to each frame
            var = info[0]['variable'].get()    # !PROBLEM! trying to retrieve variable
            print(var)


if (__name__=='__main__'):
    w = newWindow()    # main program, calling new window instance
                

我尝试使用get()cget()方法,但是从winfo_children()函数返回的信息似乎是字符串(与该方法不兼容。)列表info[0]中第一个元素的属性,我已经确认它确实是单选按钮,它已通过变量 PY_VAR#(其中“#”是一个递增的整数)进行了参数化。 )任何直接引用此变量的尝试(例如,使用getvar(name='PY_VAR#')方法)都会导致编译器告诉我,即使使用从直接读取的变量名,该名称的变量也不存在。小部件。

即使在tkinter文档中,我也没有运气找到解决方案。希望外面有人可以给我一个正确的方向!

1 个答案:

答案 0 :(得分:1)

您可以将变量添加到框架的属性:

def addFrame(self):
    newFrame = tk.Frame(self.window)
    rbVar = tk.IntVar(newFrame, 0)
    rb1 = tk.Radiobutton(newFrame, text='RB_L', variable=rbVar, value=1)
    rb1.grid(row=0, column=0)
    rb2 = tk.Radiobutton(newFrame, text='RB_R', variable=rbVar, value=2)
    rb2.grid(row=0, column=1)
    newFrame.grid(row=self.yPos, sticky='ew')
    newFrame.rbVar = rbVar  # save the variable
    self.frames.append(newFrame)    # store frame for later reference
    self.yPos += 1

然后在check()内部访问它:

def check(self):
    for unit in self.frames:
        val = unit.rbVar.get()
        print(val)