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