#python #tkinter #global-variables #python-2.7
#python #tkinter #глобальные переменные #python-2.7
Вопрос:
У меня возникли некоторые проблемы с глобальными переменными:
#Dev by Mkee
import Tkinter as tk
import sys, random
globvar = 0
class Shuffle(object):
def __init__(self,master=None):
self.master=master
self.text=tk.Label(master, text="Type in something:")
self.box=tk.Entry(master)
self.buttn = tk.Button(master, text="Done", width=10, command=self.calc())
self.result = tk.Label(self.master, text=globvar)
def hide(self):
self.text.pack_forget()
self.box.pack_forget()
self.buttn.pack_forget()
self.result.pack_forget()
def show(self):
self.text.pack(padx=2, pady=2)
self.box.focus_set()
self.box.pack(side=tk.TOP, padx=3, pady=3)
self.buttn.pack(side=tk.TOP, padx=3, pady=3)
self.result.pack(side=tk.TOP, padx=3, pady=3)
def calc(self):
word = self.box.get()
while len(word) != 0:
i = random.randrange(0, len(word))
global globvar
globvar = word[i]
word = word[0:i] word[i 1:]
class MainApp(object):
def __init__(self,master=None):
self.master=master
app=self.app=tk.Tk()
app.title("Mkee's Tools")
app.geometry('500x500')
menubar=tk.Menu(app)
self.shuffle=Shuffle(master)
self.current=self.shuffle
program_menu=tk.Menu(menubar)
program_menu.add_command(label='Shuffle',command=self.show_shuffle)
menubar.add_cascade(label='Programs', menu=program_menu)
app.config(menu=menubar)
def show_shuffle(self):
self.current.hide()
self.current=self.shuffle
self.shuffle.show()
def show_buttons(self):
self.current.hide()
self.current=self.buttons
self.buttons.show()
def main():
m=MainApp()
m.app.mainloop()
if __name__=='__main__':
main()
Я получаю проблему, когда нажимаю кнопку self.buttn = tk.Button(master, text="Done", width=10, command=self.calc())
. Я хочу, чтобы self.result = tk.Label(self.master, text=globvar)
показать globvar, взятый из calc, но вместо этого он показывает globvar, который установлен перед классом globvar = 0
.
Что я делаю не так?
Ответ №1:
- Чтобы обновить метку, установите
textvariable=self.globvar
, гдеself.globvar = tk.StringVar()
. Текст метки обновляется путем вызоваself.globvar.set
. - Изменить
command=self.calc()
наcommand=self.calc
(без круглых скобок). В круглых скобкахself.calc()
вызывается вself.buttn
определенное время. И команда получает возвращаемое значениеself.calc()
, которое равноNone
. При нажатии кнопки ничего не происходит, потомуcommand
что равноNone
. Без круглых скобокcommand
устанавливается в объект функцииself.calc
, и функция вызывается (правильно) при каждом нажатии кнопки. - Старайтесь избегать использования глобальных переменных. Это поможет
Shuffle
быть автономным, более легко повторно используемым и импортируемым.
import Tkinter as tk
import sys, random
class Shuffle(object):
def __init__(self,master=None):
self.master=master
self.text=tk.Label(master, text="Type in something:")
self.box=tk.Entry(master)
self.buttn = tk.Button(master, text="Done", width=10, command=self.calc)
self.globvar = tk.StringVar()
self.globvar.set(0)
self.result = tk.Label(self.master, textvariable=self.globvar)
def hide(self):
self.text.pack_forget()
self.box.pack_forget()
self.buttn.pack_forget()
self.result.pack_forget()
def show(self):
self.text.pack(padx=2, pady=2)
self.box.focus_set()
self.box.pack(side=tk.TOP, padx=3, pady=3)
self.buttn.pack(side=tk.TOP, padx=3, pady=3)
self.result.pack(side=tk.TOP, padx=3, pady=3)
def calc(self):
word = self.box.get()
while len(word) != 0:
i = random.randrange(0, len(word))
self.globvar.set(word[i])
word = word[0:i] word[i 1:]
class MainApp(object):
def __init__(self,master=None):
self.master=master
app=self.app=tk.Tk()
app.title("Mkee's Tools")
app.geometry('500x500')
menubar=tk.Menu(app)
self.shuffle=Shuffle(master)
self.current=self.shuffle
program_menu=tk.Menu(menubar)
program_menu.add_command(label='Shuffle',command=self.show_shuffle)
menubar.add_cascade(label='Programs', menu=program_menu)
app.config(menu=menubar)
def show_shuffle(self):
self.current.hide()
self.current=self.shuffle
self.shuffle.show()
def show_buttons(self):
self.current.hide()
self.current=self.buttons
self.buttons.show()
def main():
m=MainApp()
m.app.mainloop()
if __name__=='__main__':
main()