Какие альтернативы Globals в Python используют Tkinter? - PullRequest
0 голосов
/ 31 марта 2019

Я преподаю класс, и мне сказали избегать глобальных утверждений, использующих Python и Tkinter.Я пока не хочу преподавать классы своим ученикам

Я знаю, что могу создать все свои поля ввода и метки из подпрограммы, и мой код будет работать, но это всего лишь учение другой плохой практике

from tkinter import *

def print_name():
    print(entry_location.get())

def main():
    global main_window,entry_location
    main_window =Tk()
    Button(main_window, text="Print Name",command=print_name) .pack()
    entry_location = Entry(main_window)
    entry_location.pack()
    main_window.mainloop()

main()

Это работает с глобальным оператором, но если не считать удаления кода в main () из подпрограммы, есть ли альтернатива?

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

В вашем примере вы можете устранить глобальные переменные, зарегистрировав лямбда-функцию для кнопки; эта лямбда-функция собирает значение te в записи и передает его в качестве параметра print_name.

import tkinter as tk

def print_name(text=''):   # <- now receives a value as parameter
    print(text)

def main():
    main_window = tk.Tk()
    entry_location = tk.Entry(main_window)
    tk.Button(main_window, text="Print Name", command=lambda: print_name(entry_location.get())).pack()
    entry_location.pack()
    main_window.mainloop()

main()

Примечание:

Это отвечает частному случаю вашего примера; это не общий ответ на полное уничтожение глобалов. Альтернативные подходы могут заключаться в том, чтобы поместить переменные, необходимые глобально, в словарь или список, что позволяет их модифицировать в локальных пространствах, но, в конце концов, это может стать более сложным, чем использование надлежащего класса.
Как предлагает @AndrasDeak, лучше избегать импорта звездочек.

0 голосов
/ 31 марта 2019

как сказал phydeaux, вы можете сделать это, просто передав переменные в качестве параметров.

полный исправленный код, показанный ниже:

from tkinter import *

def print_name(entry_location):
    print(entry_location.get())

def main(main_window, entry_location):
    main_window =Tk()
    Button(main_window, text="Print Name",command=print_name) .pack()
    entry_location = Entry(main_window)
    entry_location.pack()
    main_window.mainloop()

main(main_window, entry_location)
...