Есть ли способ, чтобы виджет ввода не имитировал значение контрольной кнопки?

#python #python-3.x #tkinter #tkinter-entry

#python #python-3.x #tkinter #tkinter-запись

Вопрос:

Сразу же приведу мой код (пожалуйста, не обращайте внимания на имена переменных. Я все еще учусь использовать Python):

 root = Tk()

testvariable = 0

bruh = 0

test = Checkbutton(root, variable = testvariable, )
test.pack()

test1 = Entry(root,textvariable = bruh, text = "0", width = 4)
test1.pack()

root.mainloop()
 

Я заметил, что когда я выбираю Checkbutton, чтобы выключить или включить его, виджет ввода автоматически изменяет свое значение на любое значение Checkbutton. Есть ли способ предотвратить это?

Ответ №1:

При настройке переменных в tkinter обязательно используйте встроенные типы (https://docs.python.org/3/library/tkinter.html#coupling-widget-variables ).

Для виджета ввода вы можете напрямую использовать метод get, чтобы присвоить его значение переменной. Что касается виджета Checkbutton, не забудьте присвоить ему тип «IntVar», чтобы правильно обрабатывать передачу его значения. Я продемонстрировал, как выполнить оба вышеперечисленных действия в приведенном ниже коде.

 import tkinter as tk

root = tk.Tk()

checkbox_var = tk.IntVar()
testvariable = 0
bruh = 0

test = tk.Checkbutton(root, variable=checkbox_var)
test.pack()

test1 = tk.Entry(root)
test1.pack()

def testOutput():
    testvariable = checkbox_var.get()
    bruh = test1.get()

    print("Checkbox is", testvariable)
    print("Entry is", bruh)

button = tk.Button(root, text="Test Button", command=testOutput)
button.pack()

root.mainloop()
 

Комментарии:

1. Спасибо за ответ!

Ответ №2:

Они имитируют друг друга, потому что оба их textvariable атрибута имеют одинаковое значение. Короткий ответ — дать им разные значения для textvariable .

Кроме того, вы должны установить этот атрибут для экземпляра переменной tkinter, такой как StringVar или IntVar . Однако вам редко нужно использовать этот атрибут с Entry виджетами, поскольку сам виджет предоставляет вам методы для получения и установки значения.

Комментарии:

1. Для пояснения, «textvariable» не является проблемой, похоже, что он дублируется, но в данном случае это не проблема. Это сбой в tkinter, который, я думаю, связан с именованными аргументами. Я протестировал это, изменив имена переменных, а также использовал члены класса, чтобы посмотреть, изменит ли это результат. При выполнении всех тестов виджет Checkbutton все равно будет записывать данные в виджет ввода. Ошибка обсуждается более подробно здесь, bugs.python.org/issue38898 .