2012-03-26 3 views
1

Пожалуйста, ознакомьтесь со следующим кодом. Я новичок в Python (1 неделя и подсчет), так что все еще на кривой обучения. Использование кнопки - выбор определения - попытка изменить текст ярлыка. Графический интерфейс состоит из трех кнопок: Variable1 (при нажатии изменяет переменную Variable1) Переменная2 (при нажатии изменяет переменную Variable2) печати переменных (при нажатии печатает переменный)Проблемы с изменением текста ярлыка

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

Любая помощь будет высоко оценена.

from Tkinter import * 
import time 

class GridDemo(Frame): 
    def changevar1 (self): #change variable 
     global variable 
     self.variable = "Variable1" 
     print "You have changed the variable to:" , self.variable 
     time.sleep(0.5) 

    def changevar2 (self): #change variable 
     global variable 
     self.variable = "Variable2" 
     print "You have changed the variable to:" , self.variable 
     time.sleep(0.5) 

    def printvar (self): # print variable 
     print "The variable is:" , self.variable 
     print "" 
     time.sleep(0.5) 

    def __init__(self): 
     Frame.__init__(self) 
     self.master.title("Grid Demo") 
     global variable 
     self.variable = "Start Variable" 

     self.master.rowconfigure(0, weight = 1) 
     self.master.columnconfigure(0, weight = 1) 
     self.grid(sticky = W+E+N+S) 

     self.button1 = Button(self, text = "Variable 1", command = self.changevar1) 
     self.button1.grid(row = 1, column = 1, sticky = W+E+N+S) 

     self.button2 = Button(self, text = "Variable 2", command = self.changevar2) 
     self.button2.grid(row = 1, column = 2, sticky = W+E+N+S) 

     self.button3 = Button(self, text = "print variable" , command = self.printvar) 
     self.button3.grid(row = 1, column = 3, sticky = W+E+N+S) 

     self.label4 = Label(self, text = self.variable) 
     self.label4.grid(row = 2, column = 1, columnspan = 2, sticky = W+E+N+S) 

     self.rowconfigure(1, weight = 1) 
     self.columnconfigure(1, weight = 1) 

def main(): 
    GridDemo().mainloop() 

ответ

2

Используйте STRINGVAR и textvariable. Вот рабочий код, я комментирую, что я изменил.

from Tkinter import * 
import time 

class GridDemo(Frame): 
    def changevar1 (self): #change variable 
     self.label4String.set("Variable1") # use set method to change 
     print "You have changed the variable to:" , self.label4String.get() 
     time.sleep(0.5) 

    def changevar2 (self): #change variable 
     self.label4String.set("Variable2") # use set method to change 
     print "You have changed the variable to:" , self.label4String.get() 
     time.sleep(0.5) 

    def printvar (self): # print variable 
     print "The variable is:" , self.label4String.get() 
     print # just this is enough, no need to add "" 
     time.sleep(0.5) 

    def __init__(self): 
     Frame.__init__(self) 
     self.master.title("Grid Demo") 
     self.variable = "Start Variable" 

     self.master.rowconfigure(0, weight = 1) 
     self.master.columnconfigure(0, weight = 1) 
     self.grid(sticky = W+E+N+S) 

     self.button1 = Button(self, text = "Variable 1", command = self.changevar1) 
     self.button1.grid(row = 1, column = 1, sticky = W+E+N+S) 

     self.button2 = Button(self, text = "Variable 2", command = self.changevar2) 
     self.button2.grid(row = 1, column = 2, sticky = W+E+N+S) 

     self.button3 = Button(self, text = "print variable" , command = self.printvar) 
     self.button3.grid(row = 1, column = 3, sticky = W+E+N+S) 

     self.label4String = StringVar() # use Tk's StringVar 
     self.label4 = Label(self, textvariable=self.label4String) # bind a StringVar to textvariable attr 
     self.label4.grid(row = 2, column = 1, columnspan = 2, sticky = W+E+N+S) 

     self.rowconfigure(1, weight = 1) 
     self.columnconfigure(1, weight = 1) 

def main(): 
    GridDemo().mainloop() 

if __name__ == '__main__': 
    main() 
+0

Ray - thankyou - пораженный скоростью ответа. – DaveH

2

можно связать переменную с виджетом, но вы можете также текст (или любой другой атрибут) виджета с помощью метода configure. Например:

self.label4.configure(text="hello, world!") 

Вы можете определить свои кнопки так, чтобы они отправили соответствующую строку. Например:

определить пару кнопок:

self.button1 = Button(frame, text="Variable 1", 
         command=lambda message="Variable 1": self.changevar(message)) 
self.button2 = Button(frame, text="Variable 2", 
         command=lambda message="Variable 2": self.changevar(message)) 

определяют функцию обратного вызова:

def changevar(self, message): 
    self.label4.configure(text=message) 

Кстати, я настоятельно рекомендую не с помощью from Tkinter import *. Это плохая практика. Вместо этого импортируйте Tk и полностью квалифицируйте свои функции. Например:

import Tkinter as tk 
... 
frame = tk.Frame(...) 

Ведение import * из любого модуля плохо. Выполнение с Tkinter особенно плохо для современных версий python. Tkinter имеет так называемые «тематические» виджеты в модуле ttk. Они имеют те же имена классов, что и обычные виджеты - есть Tkinter.Button и ttk.Button.

Выполнение import * не позволяет легко использовать оба файла в одном файле. Для любого сложного приложения вам захочется смешать и сопоставить, чтобы получить нужный внешний вид. Если вы используете предпочтительный стиль импорта, вы можете сделать tk.Label(...) и ttk.Label(...), и ваш код станет кристально чистым, какой набор виджета вы используете.

+0

Да, я считаю, что определение одного «changevar», а затем использование лямбда лучше, чем определение нескольких методов «changevar». – Ray

Смежные вопросы