Текст по умолчанию не будет отображаться, если имя виджета ttk или StringVar не являются глобальными - PullRequest
0 голосов
/ 13 октября 2018

Я подумал, что было бы хорошо вытащить имена моих виджетов Tkinter из глобального пространства имен, поэтому я поместил их все в def main () и вызвал main ().Но когда я это сделал, ttk.Entry перестал отображать текст по умолчанию.Но это работает, если я изменю его на tk.Entry.

Это можно сделать с помощью кнопки и entry.get(), как показано, но в моем более крупном приложении мне нужен stringvar, насколько я знаю, мне нужен метод tk.StringVar() set().

Я попытался использовать textvariable в методе config() для имени записи, и он сделал то же самое.

Я добавил ttk.Combobox, так как это часть ttk.Entry, и он имеет то же самоепроблема.

ВОПРОС: Что-то не так с двумя глобальными переменными, объявленными для StringVar() s в примере 3?Почему или почему нет?Я не знаю, когда провести черту на глобалах.Все эти разговоры заставляют меня никогда не хотеть использовать ни одного, но, возможно, это невозможно в процедурном кодировании?

ПРИМЕР 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()

1 Ответ

0 голосов
/ 13 октября 2018

Я видел ссылки на эту проблему.Должно быть ошибка в tkinter.ttk - похоже, переменная x выходит за рамки, хотя почему это происходит только с ttk.Entry и ttk.Label, а не с их аналогами 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()
...