Есть ли способ определить, была ли переменная Tkinter изменена пользователем, а не внутренне? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть большая программа, над которой я работаю, которая загружает и отображает объекты, созданные пользователем. Каждый объект имеет определенные c настройки, которые можно изменить с помощью кнопок в меню. Когда объект загружен, настройки дисплея перезаписываются с помощью .set () к любым указанным c настройкам объекта. Я использую .trace (), чтобы изменить отображение при изменении настроек. Проблема в том, что я хочу, чтобы обратный вызов происходил только при изменении пользователя, а не при загрузке нового объекта и перезаписи настроек.

Чтобы упростить задачу, скажем, у меня есть 4 флажка и функция, которая печатает Индекс, который пользователь нажал. Тогда у меня есть кнопка, которая проверяет только четные поля. Есть ли способ, которым я мог бы сделать так, чтобы моя функция обратного вызова printIndex происходила только тогда, когда пользователь нажимает флажок, а не когда кнопка устанавливает значения ??

enter image description here

Вот упрощенный код:

import tkinter as tk

def printIndex(index):
    print("User clicked {}".format(index))

def setOnlyOdds():
    print("\nSetting only Evens")
    for i in range(4):
        value = True if (i + 1 ) % 2 == 0 else False
        print("{} is being set to {}".format(i+1,value))
        bools[i].set(value)

root = tk.Tk()
root.title("Qhat Apps")
root.grid()

bools = [] # 4 total 
checkBoxes = [] # 4 total
for i in range(4):
    bools.append(tk.BooleanVar())
    checkBoxes.append(tk.Checkbutton(root,variable = bools[i]))
    checkBoxes[i].grid(column = 1, row = i)

label1 = tk.Label(text = "1").grid(column = 0, row = 0)
label2 = tk.Label(text = "2").grid(column = 0, row = 1)
label3 = tk.Label(text = "3").grid(column = 0, row = 2)
label4 = tk.Label(text = "4").grid(column = 0, row = 3)

bools[0].trace("w", lambda *args: printIndex(1))
bools[1].trace("w", lambda *args: printIndex(2))
bools[2].trace("w", lambda *args: printIndex(3))
bools[3].trace("w", lambda *args: printIndex(4))

evens = tk.Button(root,text = "Only Evens", command = setOnlyOdds).grid(columnspan = 2)

root.mainloop()

Заранее спасибо!

1 Ответ

1 голос
/ 08 апреля 2020

Таким образом, я изменил свою кнопку проверки, чтобы иметь команду вместо того, чтобы поставить ее в след.

import tkinter as tk

def printIndex(index):
    print("User clicked {}".format(index))

def setOnlyOdds():
    print("\nSetting only Evens")
    for i in range(4):
        value = True if (i + 1 ) % 2 == 0 else False
        print("{} is being set to {}".format(i+1,value))
        bools[i].set(value)

root = tk.Tk()
root.title("Qhat Apps")
root.grid()

bools = [] # 4 total 

for i in range(4):
    bools.append(tk.BooleanVar())
checkBox1 = tk.Checkbutton(root,variable = bools[0], command = lambda: printIndex(1))
checkBox2 = tk.Checkbutton(root,variable = bools[1], command = lambda: printIndex(2))
checkBox3 = tk.Checkbutton(root,variable = bools[2], command = lambda: printIndex(3))
checkBox4 = tk.Checkbutton(root,variable = bools[3], command = lambda: printIndex(4))
checkBox1.grid(column = 1, row = 0)
checkBox2.grid(column = 1, row = 1)
checkBox3.grid(column = 1, row = 2)
checkBox4.grid(column = 1, row = 3)

label1 = tk.Label(text = "1").grid(column = 0, row = 0)
label2 = tk.Label(text = "2").grid(column = 0, row = 1)
label3 = tk.Label(text = "3").grid(column = 0, row = 2)
label4 = tk.Label(text = "4").grid(column = 0, row = 3)

evens = tk.Button(root,text = "Only Evens", command = setOnlyOdds).grid(columnspan = 2)

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...