我认为将我的 Tkinter 小部件名称从全局命名空间中取出会很好,所以我将它们全部放在 def main(( 中并称为 main((。但是当我这样做时,ttk.Entry
停止显示默认文本。但是如果我将其更改为tk.Entry
,它可以工作.
这可以通过按钮和entry.get()
完成,如图所示,但在我更大的应用程序中,我确实需要 stringvar,所以据我所知我需要tk.StringVar()
的set()
方法。
我尝试在条目名称上使用config()
方法中的textvariable
,它做了同样的事情。
我添加了一个ttk.Combobox
,因为它是ttk.Entry
的一部分,并且有同样的问题。
问题:示例 3 中为StringVar()
声明的两个全局变量有什么问题吗?为什么或为什么不呢?我不知道什么时候在全局变量上划清界限。所有对它们的喋喋不休让我永远不想使用一个,但也许这在程序编码中是不可能的?
示例 1:默认文本显示在带有tk.Entry
或ttk.Entry
的条目中
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry('200x200+500+300')
def get_txt():
lab2.config(text=ent.get())
x = tk.StringVar()
x.set("default entry text")
y = tk.StringVar()
y.set("default combo option")
ent = ttk.Entry(root, textvariable=x) # either tk or ttk can be used here and default text will show
lab = ttk.Label(root, textvariable=x)
lab2 = ttk.Label(root)
buttn = ttk.Button(root, text='GET TEXT', command=get_txt)
combo = ttk.Combobox(root, values=['dog', 'cat', 'goldfish'], textvariable=y)
lab3 = ttk.Label(root, textvariable=y)
ent.grid()
lab.grid()
lab2.grid()
buttn.grid()
combo.grid()
lab3.grid()
root.mainloop()
示例 2:默认文本显示在条目中,带有tk.Entry
,而不是ttk.Entry
import tkinter as tk
from tkinter import ttk
def main():
def get_txt():
lab2.config(text=ent.get())
x = tk.StringVar()
x.set("default entry text")
y = tk.StringVar()
y.set("default combo option")
ent = tk.Entry(root) # this is where the ttk has to be changed to tk for the default text to show up
ent.config(textvariable=x)
lab = ttk.Label(root, textvariable=x)
lab2 = ttk.Label(root)
buttn = ttk.Button(root, text='GET TEXT', command=get_txt)
combo = ttk.Combobox(root, values=['dog', 'cat', 'goldfish'], textvariable=y) # there's no tk.Combobox
lab3 = ttk.Label(root, textvariable=y)
ent.grid()
lab.grid()
lab2.grid()
buttn.grid()
combo.grid()
lab3.grid()
root = tk.Tk()
main()
root.mainloop()
示例 3:对StringVar()
的全局引用 --回到全局??
import tkinter as tk
from tkinter import ttk
def main():
def get_txt():
lab2.config(text=ent.get())
# x = tk.StringVar()
x.set("default entry text")
# y = tk.StringVar()
y.set("default combo option")
ent = ttk.Entry(root) # this is where the ttk has to be changed to tk for the default text to show up
ent.config(textvariable=x)
lab = ttk.Label(root, textvariable=x)
lab2 = ttk.Label(root)
buttn = ttk.Button(root, text='GET TEXT', command=get_txt)
combo = ttk.Combobox(root, values=['dog', 'cat', 'goldfish'], textvariable=y) # there's no tk.Combobox
lab3 = ttk.Label(root, textvariable=y)
ent.grid()
lab.grid()
lab2.grid()
buttn.grid()
combo.grid()
lab3.grid()
root = tk.Tk()
x = tk.StringVar()
y = tk.StringVar()
main()
root.mainloop()
我已经看到了对这个问题的引用。一定是 tkinter.ttk 中的一个错误 - 看起来变量 x 超出了范围,尽管为什么它只发生在 ttk 中。条目和 ttk。标签,而不是与他们的 tk 同行超越了我。
无论如何,以下是一个更整洁的解决方案,工作正常:
import tkinter as tk
from tkinter import ttk
class main(tk.Tk):
def get_txt(self):
self.lab2.config(text=self.ent.get())
def __init__(self):
super().__init__()
self.x = tk.StringVar()
self.x.set("default entry text")
self.y = tk.StringVar()
self.y.set("default combo option")
self.ent = ttk.Entry(self, textvariable=self.x)
lab = ttk.Label(self, textvariable=self.x)
self.lab2 = ttk.Label(self)
buttn = ttk.Button(self, text='GET TEXT', command=self.get_txt)
combo = ttk.Combobox(self, values=['dog', 'cat', 'goldfish'], textvariable=self.y)
lab3 = ttk.Label(self, textvariable=self.y)
self.ent.grid()
lab.grid()
self.lab2.grid()
buttn.grid()
combo.grid()
lab3.grid()
root = main()
root.mainloop()