【发布时间】: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()取值。