#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. Ничего технического, глобальные переменные считаются плохой практикой, потому что они приводят к беспорядочному, трудному в обслуживании коду, что приводит к ошибкам.