【问题标题】:Is it possible to reference a variable directly from a stored tkinter widget?是否可以直接从存储的 tkinter 小部件中引用变量?
【发布时间】:2020-08-12 18:24:58
【问题描述】:

这里是堆栈的新成员,正在为我在一个小型 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 文档中,我也没有找到解决方案的运气。希望有人可以在正确的方向上推动我!

【问题讨论】:

  • 可以直接使用rbVar.get()取值。

标签: python tkinter


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2016-11-28
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多