一直在尝试使用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/

10-12 18:51