gpt4 book ai didi

python - `tkinter. Spinbox()` 的行为如何取决于传递给其 `textvariable` 的值的类型

转载 作者:太空宇宙 更新时间:2023-11-03 18:02:26 25 4
gpt4 key购买 nike

一直在尝试学习 Python (3.4),这是我在 Stack Overflow 上的第一篇文章。我对 tkinter.Spinbox() 小部件构造函数中的 textvariable 选项的行为有疑问。

以下代码有效。这是 6 个旋转盒的布局,有 3 对旋转盒(每对并排)。一对中的每个旋转框都应该是彼此独立的,即当一个旋转框发生变化时,它不会影响另一个。

A 对接收 textvariable 参数作为 StringVar() 类型(例如 var = StringVar())

B 对接收其 textvariable 参数,作为在引号之间声明的字符串(例如 var = '0')

C 对接收其 textvariable 参数,类型为 integer(例如 var = 0)

注意:我想发布生成的窗口的屏幕截图,但页面显示“您需要至少 10 个声誉才能发布图像”...我目前显然没有...

我想了解为什么Pair 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()

最佳答案

原因无关紧要。将字符串或整数传递给 textvariable 选项是不正确的用法。虽然它有时会起作用(取决于您如何定义“工作”),但它是不正确的。 textvariable 需要 tkinter 提供的特殊变量类之一。如果不使用其中之一,则定义 textvariable 属性根本没有意义。

但是,回答具体问题:

A 对 每个都有一个唯一的文本变量,因此它按预期工作。底层 tcl/tk 引擎为每个实例获取唯一的字符串,这就是两者独立的原因。

Pair B 有效地获取 no 文本变量,因为您指定了空字符串。对于底层 tcl/tk 引擎来说,这种情况下的空字符串相当于 python 的 None。如果您使用非空字符串而不是 ''(例如:'w00t'),您会注意到与 C 对相同的行为。这是因为每个spinbox 获取一个具有相同名称的变量,这对于底层 tcl/tk 引擎意味着它们是相同的文本变量,因此绑定(bind)在一起。

C 对使用常数 0(零)。因为它是一个常量,所以两个小部件实际上都获得相同的文本变量,因为最终此参数成为 tcl/tk 变量的名称。由于两个旋转框的名称相同,因此它们被捆绑在一起。

关于python - `tkinter. Spinbox()` 的行为如何取决于传递给其 `textvariable` 的值的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27467520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com