如果ttk小部件名称或StringVar不是全局的,则默认文本不会显示

时间:2018-10-13 11:11:00

标签: python tkinter global-variables tkinter-entry

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

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

我尝试在条目名称的set()方法中使用textvariable,但效果相同。

我添加了一个config(),因为它是ttk.Combobox的一部分,并且存在相同的问题。

问题:示例3中为ttk.Entry声明的两个全局变量有什么问题吗?为什么或者为什么不?我不知道何时在全局变量上划清界限。所有针对他们的抱怨使我永远都不想使用一个,但是也许在过程编码中这是不可能的?

示例1:默认文本显示在带有StringVar()tk.Entry的条目中

ttk.Entry

示例2:默认文本以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() 而不是tk.Entry的形式显示在条目中

ttk.Entry

示例3:对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() 的全局引用-返回全局范围?

StringVar()

1 个答案:

答案 0 :(得分:1)

我已经看到有关此问题的参考。一定是tkinter.ttk中的错误-看起来变量x超出了范围,尽管为什么只在ttk.Entry和ttk.Label中发生而不是在与tk对应的原因中发生?

无论如何,以下是更整洁的解决方案,并且效果很好:

SELECT SND.userid, SND.firstname, SND.lastname, M.age, M.city, M.country
FROM msg as M
JOIN users as SND 
ON SND.userid = M.msg_from
WHERE M.msg_to = 'userid 1' AND product = 'rice' AND price >='$100'