Использование результата команды кнопки Tkinter для другой функции команды Tkinter

#python #tkinter

Вопрос:

Я изо всех сил старался завершить проект, над которым работаю в этой части. Я хочу использовать результат функции команды кнопки для другой функции команды кнопки всякий раз, когда пользователь нажимает вторую кнопку. Пример кода прилагается ниже. Идея этого идиоматического сценария заключается в том, что первая кнопка предназначена для калибровки координат (фактическое пространство на экране компьютера путем вычисления их соответствующих соотношений), а вторая кнопка будет использовать результат этой функции калибровки для «преобразования» координат, которые будут введены для второй кнопки. Просто игнорируйте фиктивные операции, которые я здесь отразил.

 from tkinter import *
import tkinter as tk

root = Tk()


def solve1():
    x = [1, 2, 3]
    print(x)

def solve2():
    y = [4, 5, 6]
    print(y)

    z = x   y
    print(z)  # this is not working


Button1 = Button(root, text="Opt 1", command=solve1).grid(row=1, column=1, sticky="w")
Button2 = Button(root, text="Opt 2", command=solve2).grid(row=2, column=1, sticky="w")

root.mainloop()
 

Код не работает, так как python говорит, что решение 1 не определено. Я новичок в мире программирования, поэтому приветствую любые общие мысли. PS: Мне нужно извлечь отчет о результатах этих двух функций, поэтому я не могу объединить их в одну функцию

Ответ №1:

Простой и простой способ-определить переменную как глобальную. Например (с некоторыми другими улучшениями передовой практики):

 import tkinter as tk

root = tk.Tk()

def solve1():
    global x
    x = [1, 2, 3]
    print(x)

def solve2():
    y = [4, 5, 6]
    print(y)

    z = x   y
    print(z)

Button1 = tk.Button(root, text="Opt 1", command=solve1)
Button1.grid(row=1, column=1, sticky="w")
Button2 = tk.Button(root, text="Opt 2", command=solve2)
Button2.grid(row=2, column=1, sticky="w")

root.mainloop()
 

Правильный способ-это создать класс:

 import tkinter as tk
    
class MSDS(tk.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        Button1 = tk.Button(self, text="Opt 1", command=self.solve1)
        Button1.grid(row=1, column=1, sticky="w")
        Button2 = tk.Button(self, text="Opt 2", command=self.solve2)
        Button2.grid(row=2, column=1, sticky="w")
    
    def solve1(self):
        self.x = [1, 2, 3]
        print(self.x)
    
    def solve2():
        y = [4, 5, 6]
        print(y)
    
        z = self.x   y
        print(z) 
    
def main():
    root = tk.Tk()
    win = MSDS(root)
    win.pack()
    root.mainloop()

if __name__ == "__main__":
    main()
 

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

1. Большое спасибо @Novel, это работает. Что касается глобального, я читаю на форумах, что использовать это не рекомендуется? Почему это так?

2. Ничего технического, глобальные переменные считаются плохой практикой, потому что они приводят к беспорядочному, трудному в обслуживании коду, что приводит к ошибкам.