如果 ttk 小部件名称或字符串变量不是全局的,则不会显示默认文本



我认为将我的 Tkinter 小部件名称从全局命名空间中取出会很好,所以我将它们全部放在 def main(( 中并称为 main((。但是当我这样做时,ttk.Entry停止显示默认文本。但是如果我将其更改为tk.Entry,它可以工作.

这可以通过按钮和entry.get()完成,如图所示,但在我更大的应用程序中,我确实需要 stringvar,所以据我所知我需要tk.StringVar()set()方法。

我尝试在条目名称上使用config()方法中的textvariable,它做了同样的事情。

我添加了一个ttk.Combobox,因为它是ttk.Entry的一部分,并且有同样的问题。

问题:示例 3 中为StringVar()声明的两个全局变量有什么问题吗?为什么或为什么不呢?我不知道什么时候在全局变量上划清界限。所有对它们的喋喋不休让我永远不想使用一个,但也许这在程序编码中是不可能的?

示例 1:默认文本显示在带有tk.Entryttk.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()

相关内容

  • 没有找到相关文章

最新更新