У меня есть два набора кода. Один работает, другой нет, и я не знаю почему. В первом наборе кода я храню свое приложение в классе и ссылаюсь на все там. Во втором я храню все в основной функции и использую ее там.
Основные детали проблемы здесь:
Я использую виджет ввода и виджет кнопки, который изначально отключен. Я хочу, чтобы состояние кнопки было нормальным, когда в текстовом поле виджетов ввода есть текст.
Я искал в Интернете много ответов на первый набор кода, но самый близкий, который я получил, - второй набор кода. Сначала я попытался интегрировать его в мой код, однако это не сработало. Поэтому я взял код, обрезал его до минимума и поместил все в основную функцию.
Основное различие между ними состоит в том, что один находится в классе, а другой - в главной функции.
import tkinter as tk
class Aplication(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self,master)
self.grid()
self.button_clicks = 0
something = tk.StringVar()
button3 = tk.Button(self, text="Print entry", padx = 10, height = 2, bg = "blue", state = "disabled")
entry = tk.Entry(self, textvariable = something)
something.trace('w', self.ActivateButton) #need this to always be exsecuted
entry.grid(column = 2, row = 1)
button3["command"] = lambda: self.PrintEntry(entry.get())
button3.grid(padx = 10, pady = 10)
def PrintEntry (self, entry):
print(entry)
def ActivateButton(self, *_):
if something.get():
button3['state'] = "normal"
else:
button3['state'] = "disabled"
if __name__ == '__main__':
top= tk.Tk()
top.title("Simple Button")
top.geometry("500x300")
app = Aplication(top)
top.mainloop()
def PrintEntry (entry):
print(entry)
def ActivateButton(*_):
if entry.get():
button3['state'] = "normal"
else:
button3['state'] = "disabled"
if __name__ == '__main__':
top= tk.Tk()
top.title("Simple Button")
top.geometry("500x300")
something = tk.StringVar()
button3 = tk.Button(top, text="Print entry", padx = 10, height = 2, bg = "blue", state = "disabled")
entry = tk.Entry(top, textvariable = something, bd = 2)
something.trace('w', ActivateButton)
entry.grid(column = 2, row = 3)
button3["command"] = lambda: PrintEntry(entry.get())
button3.grid(row = 3, column = 1, padx = 10, pady = 10)
top.mainloop()
Нет сообщений об ошибках; однако в первом наборе вы найдете, что состояние кнопки никогда не будет установлено в нормальное состояние. Есть ли способ сделать это для первого? В чем разница между двумя, что делает невозможным включение кнопки в первом, если это невозможно?