Python 他是怎么做的。Spinbox()`行为取决于传递给其`textvariable'的值的类型`
我一直在学习Python(3.4),这是我第一篇关于堆栈溢出的文章。 我对Python 他是怎么做的。Spinbox()`行为取决于传递给其`textvariable'的值的类型`,python,tkinter,Python,Tkinter,我一直在学习Python(3.4),这是我第一篇关于堆栈溢出的文章。 我对tkinter.Spinbox()小部件构造函数中的textvariable选项的行为有疑问 以下代码正在工作。这是一个由6个Spinbox组成的布局,共有3对Spinbox(每对并排)。假设一对中的每个spinbox彼此独立,即当一个spinbox发生变化时,它不会影响另一个spinbox 对A以类型StringVar()的形式接收其textvariable参数(例如var=StringVar()) 对B以引号之间声明的
tkinter.Spinbox()
小部件构造函数中的textvariable
选项的行为有疑问
以下代码正在工作。这是一个由6个Spinbox组成的布局,共有3对Spinbox(每对并排)。假设一对中的每个spinbox彼此独立,即当一个spinbox发生变化时,它不会影响另一个spinbox
对A以类型StringVar()
的形式接收其textvariable
参数(例如var=StringVar()
)
对B以引号之间声明的字符串形式接收其textvariable
参数(例如var='0'
)
对C将其textvariable
参数作为类型integer
接收(例如var=0
)
注意:我想发布结果窗口的屏幕截图,但页面上说“你需要至少10个声誉来发布图像”。。。显然我现在还没有
我只是想了解为什么C对的成员看起来彼此“不独立”的原因是什么?->更改其中一个,另一个遵循相同的更改
tkinter.Spinbox()
中的textvariable
参数对不同类型赋值的解释有何不同
这是我的密码:
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()
从tkinter导入*
类spinModuleStrA():
''spinModuleNum()-将textvariable作为''的Spinbox'
定义初始化(自、主、模块名):
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)
类spinModuleStrB():
''spinModuleNum()-将textvariable作为''的Spinbox'
定义初始化(自、主、模块名):
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)
类SpinModuleEnum():
''spinModuleNum()-将textvariable作为''的Spinbox'
定义初始化(自、主、模块名):
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)
类app():
定义初始化(自):
self.root=Tk()
自根几何体('300x300+500+200')
对于范围(2)中的i:#列数
self.root.columnconfigure(i,权重=1)
对于范围(3)中的i:#行数
self.root.rowconfigure(i,权重=1)
self.frame1=Frame(self.root,bg='#f55')
self.frame1.grid(行=0,列=0,padx=10,pady=10,粘性=W+E+N+S)
self.module1=spinModuleStrA(self.frame1,“自旋A”)
self.frame2=Frame(self.root,bg='#faa')
self.frame2.grid(行=0,列=1,padx=10,pady=10,粘性=W+E+N+S)
self.module2=spinModuleStrA(self.frame2,“Spin”)
self.frame3=Frame(self.root,bg='#5f5')
self.frame3.grid(行=1,列=0,padx=10,pady=10,粘性=W+E+N+S)
self.module3=spinModuleStrB(self.frame3,“自旋A”)
self.frame4=Frame(self.root,bg='#5fa')
self.frame4.grid(行=1,列=1,padx=10,pady=10,粘性=W+E+N+S)
self.module4=spinModuleStrB(self.frame4,“Spin B”)
self.frame5=Frame(self.root,bg='#55f')
self.frame5.grid(行=2,列=0,padx=10,pady=10,粘性=W+E+N+S)
self.module5=spinModuleNum(self.frame5,“自旋A”)
self.frame6=Frame(self.root,bg='#5af')
self.frame6.grid(行=2,列=1,padx=10,pady=10,粘性=W+E+N+S)
self.module6=spinModuleNum(self.frame6,“Spin B”)
app1=app()
原因无关紧要。向textvariable选项传递字符串或整数是不正确的用法。虽然它有时会起作用(取决于你如何定义“工作”),但它是不正确的。textvariable需要tkinter提供的一个特殊变量类。如果不使用其中之一,定义textvariable属性就毫无意义
但是,要回答具体问题:
对A每个都得到一个唯一的textvariable,因此它可以按预期工作。底层的tcl/tk引擎为每个实例获取一个唯一的字符串,这就是为什么这两个实例是独立的
对B实际上不获取textvariable,因为您指定了空字符串。对于底层的tcl/tk引擎,这种情况下的空字符串相当于python的None
。如果使用了非空字符串(例如:'w00t'
),而不是”
,则会注意到与对C相同的行为。这是因为每个spinbox都会获得一个具有相同名称的变量,对于底层tcl/tk引擎来说,这意味着它们是相同的文本变量,因此绑定在一起
对C使用常数0(零)。因为它是一个常量,所以两个小部件实际上都会得到相同的textvariable,因为这个参数最终会成为tcl/tk变量的名称。由于两个旋转盒的名称相同,因此它们被捆绑在一起。哈哈。。。我猜B对不应该是w对
class spinModuleStrC():
''' spinModuleNum() - Spinbox taking textvariable as <'' string value> '''
def __init__(self, master, moduleName):
self.root = master
self.moduleName = moduleName
self.root.grid()
# tested this with 'r' and then with 'p' (anything different from 'r')
self.var = '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)
for i in range(4): # number of rows
self.root.rowconfigure(i, weight=1)
self.frame7 = Frame(self.root, bg='#5f5')
self.frame7.grid(row=3, column=0, padx=10, pady=10, sticky=W+E+N+S)
self.module7 = spinModuleStrC(self.frame7, "Spin <'p'> A")
self.frame8 = Frame(self.root, bg='#5fa')
self.frame8.grid(row=3, column=1, padx=10, pady=10, sticky=W+E+N+S)
self.module8 = spinModuleStrC(self.frame8, "Spin <'p'> B")