一直在尝试使用Python(3.4),这是我关于Stack Overflow的第一篇文章。
我对textvariable
小部件构造函数中tkinter.Spinbox()
选项的行为有疑问。
以下代码有效。它是6个Spinbox的布局,有3对Spinbox(每对并排)。一对中的每个旋转框都假定彼此独立,即,当一个更改时,它不会影响另一个。
配对A接收到的textvariable
参数为StringVar()
类型(例如var = StringVar()
)
B对接收其textvariable
参数作为引号之间声明的字符串(例如var = '0'
)
C对收到其textvariable
参数,其类型为integer
(例如var = 0
)
注意:我想发布一个结果窗口的屏幕截图,但是页面上显示“您至少需要10个声誉才能发布图像” ...我目前显然还没有...
我想了解为什么Pair C的成员似乎彼此“非独立”? ->更改一个,然后另一个进行相同的更改。
对于不同类型的值,textvariable
中的tkinter.Spinbox()
参数的解释有何不同?
这是我的代码:
from tkinter import *
class spinModuleStrA():
''' spinModuleNum() - Spinbox taking textvariable as <StringVar() value> '''
def __init__(self, master, moduleName):
self.root = master
self.moduleName = moduleName
self.root.grid()
self.var = StringVar()
self.var.set('r')
self.label1 = Label(self.root, text=self.moduleName, bg=self.root["bg"])
self.label1.pack(expand = True)
self.spinBox1 = Spinbox(self.root ,from_=0, to=100, width=10, textvariable=self.var)
self.spinBox1.pack(expand = True)
class spinModuleStrB():
''' spinModuleNum() - Spinbox taking textvariable as <'' string value> '''
def __init__(self, master, moduleName):
self.root = master
self.moduleName = moduleName
self.root.grid()
self.var = ''
self.label1 = Label(self.root, text=self.moduleName, bg=self.root["bg"])
self.label1.pack(expand = True)
self.spinBox1 = Spinbox(self.root ,from_=0, to=100, width=10, textvariable=self.var)
self.spinBox1.pack(expand = True)
class spinModuleNum():
''' spinModuleNum() - Spinbox taking textvariable as <numerical value> '''
def __init__(self, master, moduleName):
self.root = master
self.moduleName = moduleName
self.root.grid()
self.var = 0
self.label1 = Label(self.root, text=self.moduleName, bg=self.root["bg"])
self.label1.pack(expand = True)
self.spinBox1 = Spinbox(self.root ,from_=0, to=100, width=10, textvariable=self.var)
self.spinBox1.pack(expand = True)
class app():
def __init__(self):
self.root = Tk()
self.root.geometry('300x300+500+200')
for i in range(2): # number of columns
self.root.columnconfigure(i, weight=1)
for i in range(3): # number of rows
self.root.rowconfigure(i, weight=1)
self.frame1 = Frame(self.root, bg='#f55')
self.frame1.grid(row=0, column=0, padx=10, pady=10, sticky=W+E+N+S)
self.module1 = spinModuleStrA(self.frame1, "Spin <StringVar()> A")
self.frame2 = Frame(self.root, bg='#faa')
self.frame2.grid(row=0, column=1, padx=10, pady=10, sticky=W+E+N+S)
self.module2 = spinModuleStrA(self.frame2, "Spin <StringVar() B>")
self.frame3 = Frame(self.root, bg='#5f5')
self.frame3.grid(row=1, column=0, padx=10, pady=10, sticky=W+E+N+S)
self.module3 = spinModuleStrB(self.frame3, "Spin <''> A")
self.frame4 = Frame(self.root, bg='#5fa')
self.frame4.grid(row=1, column=1, padx=10, pady=10, sticky=W+E+N+S)
self.module4 = spinModuleStrB(self.frame4, "Spin <''> B")
self.frame5 = Frame(self.root, bg='#55f')
self.frame5.grid(row=2, column=0, padx=10, pady=10, sticky=W+E+N+S)
self.module5 = spinModuleNum(self.frame5, "Spin <numerical> A")
self.frame6 = Frame(self.root, bg='#5af')
self.frame6.grid(row=2, column=1, padx=10, pady=10, sticky=W+E+N+S)
self.module6 = spinModuleNum(self.frame6, "Spin <numerical> B")
app1 = app()
最佳答案
原因无关紧要。将字符串或整数传递给textvariable选项是不正确的用法。尽管有时它可以工作(取决于您定义“工作”的方式),但这是不正确的。 textvariable需要tkinter提供的特殊变量类之一。如果不使用其中之一,则根本没有必要定义textvariable属性。
但是,要回答特定的问题:
配对A各自获得唯一的textvariable,因此可以按预期工作。底层的tcl / tk引擎为每个实例获取唯一的字符串,这就是为什么两者是独立的。
由于您指定了空字符串,因此B对实际上不会获得textvariable。对于基本的tcl / tk引擎,在这种情况下,空字符串等效于python的None
。如果您使用的是非空字符串(例如:''
)而不是'w00t'
,那么您会注意到与对C相同的行为。这是因为每个旋转框都获得了一个具有相同名称的变量, tcl / tk引擎意味着它们是相同的textvariable,因此联系在一起。
对C使用常数0(零)。因为它是一个常数,所以两个小部件都有效地获得了相同的textvariable,因为最终此参数成为tcl / tk变量的名称。由于两个旋转框的名称相同,因此将它们绑定在一起。
关于python - tkinter怎么样。 Spinbox()的行为取决于传递给其textvariable的值的类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27467520/