Проблемы с изменением текста метки - PullRequest
1 голос
/ 26 марта 2012

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

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

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

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 ]

2 голосов
/ 26 марта 2012

Вы можете связать переменную с виджетом, но вы также можете добавить текст (или любой атрибут) виджета с помощью метода 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(...), и ваш код станет совершенно ясным, какой набор виджетов вы используете.

2 голосов
/ 26 марта 2012

Используйте 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()
...