Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以直接从存储的tkinter小部件引用变量?_Python_Tkinter - Fatal编程技术网

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

Python 是否可以直接从存储的tkinter小部件引用变量?,python,tkinter,Python,Tkinter,这里是堆栈的新成员,正在寻找一点帮助,解决我的一个小型Python项目遇到的一个问题。我目前正在尝试使用tkinter库创建一个GUI,它能够根据用户的意愿动态添加(和稍后删除)新字段。我在读取连接到单选按钮小部件的变量的状态时遇到了一个问题,因为我不必直接访问变量本身,只需要访问小部件 为了更好地解释我的情况,我将包括我的代码。下面是此项目的基类,详细介绍了窗口对象的创建: (请注意,我对Python相当陌生,因此请原谅任何糟糕或次优的Python语法!) 在主窗口中创建的“fieldButt

这里是堆栈的新成员,正在寻找一点帮助,解决我的一个小型Python项目遇到的一个问题。我目前正在尝试使用tkinter库创建一个GUI,它能够根据用户的意愿动态添加(和稍后删除)新字段。我在读取连接到单选按钮小部件的变量的状态时遇到了一个问题,因为我不必直接访问变量本身,只需要访问小部件

为了更好地解释我的情况,我将包括我的代码。下面是此项目的基类,详细介绍了窗口对象的创建: (请注意,我对Python相当陌生,因此请原谅任何糟糕或次优的Python语法!)

在主窗口中创建的“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
最后,假设“check”函数只是检索属于每个帧的变量状态(这里,为了示例,它只是简单地打印出来)

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


即使在tkinter文档中,我也没有找到解决方案。希望有人能给我一个正确的方向推

您可以将变量添加到帧的属性中:

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
然后在
检查()中访问它:


您可以直接使用
rbVar.get()
检索该值。
    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
                
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
def check(self):
    for unit in self.frames:
        val = unit.rbVar.get()
        print(val)