Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 他是怎么做的。Spinbox()`行为取决于传递给其`textvariable'的值的类型`_Python_Tkinter - Fatal编程技术网

Python 他是怎么做的。Spinbox()`行为取决于传递给其`textvariable'的值的类型`

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以引号之间声明的

我一直在学习Python(3.4),这是我第一篇关于堆栈溢出的文章。 我对
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")