如果我在一个功能中放一个单选按钮并绘制它们; 它们第一次被绘制时,你不能将它们悬停在它们之上,而不会让它们看起来像是被选中.
函数中的相同代码不会出现此行为.
from Tkinter import *
def App(master):
v = StringVar()
v.set('python') # initialize
lable1 = Label(master, text=' hovering over below radio buttons will cause them to look like they are selected')
lable1.pack()
runtimeFrame = Frame(master, relief=GROOVE, borderwidth = 3)
runtimeFrame.pack(fill = X, pady = 5, padx = 5)
for mode in ['java', 'python', 'jython']:
b = Radiobutton(runtimeFrame, text=mode, variable=v, value=mode, indicatoron = 1 )
b.pack(side = LEFT)
if __name__ == '__main__':
master = Tk()
App(master)
#The following code chunk is the same as that in App()
#------------------------
v = StringVar()
v.set('python') # initialize
lable1 = Label(master, text=' hovering over below radio buttons will cause them to Not look selected as expected')
lable1.pack()
runtimeFrame = Frame(master, relief=GROOVE, borderwidth = 3)
runtimeFrame.pack(fill = X, pady = 5, padx = 5)
for mode in ['java', 'python', 'jython']:
b = Radiobutton(runtimeFrame, text=mode, variable=v, value=mode, indicatoron = 1 )
b.pack(side = LEFT)
#------------------------
mainloop()
Run Code Online (Sandbox Code Playgroud)
一旦你做出选择,这不会再发生.难道我做错了什么?有没有解决方法,因为我的代码必须在函数中!
这是我在Tkinter找到的第二个基本错误.Python GUI开发有什么更好的东西吗?
ps:我正在使用python 2.7
Jef*_*nez 10
存储变量对象的位置(StringVar,v,在您的情况下)必须保持不变,以便这种奇怪的行为不会出现.我的猜测是我们看到这种行为因为v超出了范围,出现了问题.除了使用全局之外,我无法想到从函数中执行此操作的方法.
破碎的代码:
from Tkinter import *
def App(master):
v = StringVar()
v.set('python')
lable1 = Label(master, text=' hovering over below radio buttons will cause them to look like they are selected')
lable1.pack()
runtimeFrame = Frame(master, relief=GROOVE, borderwidth=3)
runtimeFrame.pack(fill=X, pady=5, padx=5)
for mode in ['java', 'python', 'jython']:
b = Radiobutton(runtimeFrame, text=mode, variable=v, value=mode, indicatoron=1)
b.pack(side=LEFT)
if __name__ == '__main__':
master = Tk()
App(master)
mainloop()
Run Code Online (Sandbox Code Playgroud)
示例修复:
from Tkinter import *
def App(master, radio_var):
radio_var.set('python')
lable1 = Label(master, text=' hovering over below radio buttons will cause them to look like they are selected')
lable1.pack()
runtimeFrame = Frame(master, relief=GROOVE, borderwidth=3)
runtimeFrame.pack(fill=X, pady=5, padx=5)
for mode in ['java', 'python', 'jython']:
b = Radiobutton(runtimeFrame, text=mode, variable=radio_var, value=mode, indicatoron=1)
b.pack(side=LEFT)
if __name__ == '__main__':
master = Tk()
radio_var = StringVar()
App(master, radio_var)
mainloop()
Run Code Online (Sandbox Code Playgroud)
考虑一下,如果你有多个需要持久化的变量,你可以传入一个变量列表或字典.
此外,如果"必须在函数中"是作业分配要求,请考虑将代码包装在类中.我不是tk专家,但这似乎是组织代码的首选方式.
示例修复2:
from Tkinter import *
class App(object):
def __init__(self, master):
self.radio_var = StringVar()
self.radio_var.set('python')
lable1 = Label(master, text=' hovering over below radio buttons will cause them to look like they are selected')
lable1.pack()
runtimeFrame = Frame(master, relief=GROOVE, borderwidth=3)
runtimeFrame.pack(fill=X, pady=5, padx=5)
for mode in ['java', 'python', 'jython']:
b = Radiobutton(runtimeFrame, text=mode, variable=self.radio_var, value=mode, indicatoron=1)
b.pack(side=LEFT)
if __name__ == '__main__':
master = Tk()
app = App(master)
mainloop()
Run Code Online (Sandbox Code Playgroud)
请注意一个小的变化
app = App(master)
Run Code Online (Sandbox Code Playgroud)
这是必需的,以便App实例不会过早地进行垃圾回收.这将有效地将self.radio_var拉出范围,我们又回到了原点.
rec*_*gle -1
我承认你发现了一个很奇怪的“故障”。我还没有完全准备好将其称为故障,因为我不确定是什么原因造成的。它似乎源于变量, 参数。解决方法是通过 .cget ('text')方法获取小部件的实际文本,而不是获取变量。
我对您的App功能的修改:
def App(master):
v = StringVar()
v.set('python') # initialize
lable1 = Label(master, text=' hovering over below radio buttons will cause them to look like they are selected')
lable1.pack()
runtimeFrame = Frame(master, relief=GROOVE, borderwidth = 3)
runtimeFrame.pack(fill = X, pady = 5, padx = 5)
for mode in ['java', 'python', 'jython']:
b = Radiobutton(runtimeFrame, text=mode, value=mode, indicatoron = 1 ) # I omitted the variable argument, which seemed to be the root of your troubles.
b.pack(side = LEFT)
b.deselect() # manually deselects each instance of the Radiobutton.
b.select() # manually selects a default instance of the Radiobutton.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9690 次 |
| 最近记录: |