Подтвердить что ты не робот

Изменение текста на ярлыке

У меня возникли проблемы с использованием привязки клавиш для изменения значения метки или любого параметра. Это мой код:

from tkinter import*

class MyGUI:
  def __init__(self):
    self.__mainWindow = Tk()
    #self.fram1 = Frame(self.__mainWindow)
    self.labelText = 'Enter amount to deposit'
    self.depositLabel = Label(self.__mainWindow, text = self.labelText)
    self.depositEntry = Entry(self.__mainWindow, width = 10)
    self.depositEntry.bind('<Return>', self.depositCallBack)
    self.depositLabel.pack()
    self.depositEntry.pack()

    mainloop()

  def depositCallBack(self,event):
    self.labelText = 'change the value'
    print(self.labelText)

myGUI = MyGUI()

Когда я запускаю это, я нажимаю на поле ввода и нажимаю Enter, надеясь, что метка изменит значение на "изменить значение". Однако, пока он печатает этот текст, метка остается неизменной.

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

Также, на боковой ноте, какую роль играет "master" в tkinter?

4b9b3361

Ответ 1

self.labelText = 'change the value'

В предложении make labelText ссылается на "изменить значение", но не меняет текст depositLabel.

Чтобы изменить текст depositLabel, используйте одну из следующих настроек:

self.depositLabel['text'] = 'change the value'

ИЛИ

self.depositLabel.config(text='change the value')

Ответ 2

Вы также можете определить textvariable при создании метки и изменить текст, чтобы обновить текст в метке. Вот пример:

labelText = Stringvar()
depositLabel = Label(self, textvariable=labelText)
depositLabel.grid()

def updateDepositLabel(txt) # you may have to use *args in some cases
    labelText.set(txt)

Нет необходимости обновлять текст в depositLabel вручную. Tk делает это для вас.

Ответ 3

Я сделал небольшое приложение tkinter, которое устанавливает метку после нажатия кнопки

#!/usr/bin/env python
from Tkinter import *
from tkFileDialog import askopenfilename
from tkFileDialog import askdirectory


class Application:
    def __init__(self, master):
        frame = Frame(master,width=200,height=200)
        frame.pack()

        self.log_file_btn = Button(frame, text="Select Log File", command=self.selectLogFile,width=25).grid(row=0)
        self.image_folder_btn = Button(frame, text="Select Image Folder", command=self.selectImageFile,width=25).grid(row=1)
        self.quite_button = Button(frame, text="QUIT", fg="red", command=frame.quit,width=25).grid(row=5)

        self.logFilePath =StringVar()
        self.imageFilePath = StringVar()
        self.labelFolder = Label(frame,textvariable=self.logFilePath).grid(row=0,column=1)
        self.labelImageFile = Label(frame,textvariable = self.imageFilePath).grid(row = 1,column=1)

        def selectLogFile(self):
            filename = askopenfilename()
            self.logFilePath.set(filename)

        def selectImageFile(self):
            imageFolder = askdirectory()
            self.imageFilePath.set(imageFolder)

root = Tk()
root.title("Geo Tagging")
root.geometry("600x100")
app = Application(root)
root.mainloop()

Ответ 4

Вот еще один, я думаю. Только для справки. Пусть задана переменная как экземпляр класса StringVar

Если вы программируете Tk с использованием языка Tcl, вы можете попросить систему сообщить вам, когда изменяется переменная. Инструментарий Tk может использовать эту функцию, называемую трассировкой, для обновления определенных виджетов при изменении связанной переменной.

Невозможно отслеживать изменения переменных Python, но Tkinter позволяет создавать переменные обертки, которые можно использовать везде, где Tk может использовать отслеживаемую переменную Tcl.

text = StringVar()
self.depositLabel = Label(self.__mainWindow, text = self.labelText, textvariable = text)
                                                                    ^^^^^^^^^^^^^^^^^
  def depositCallBack(self,event):
      text.set('change the value')

Ответ 5

Используйте метод config для изменения значения метки:

top = Tk()

l = Label(top)
l.pack()

l.config(text = "Hello World", width = "50" , )

Ответ 6

Есть много способов решения этой проблемы. Есть много способов сделать это. Я собираюсь дать вам самое простое решение этого вопроса, который я знаю. При изменении текста метки или любого вида виджета действительно. Я бы сделал это так.

Name_Of_Label["text"] = "Your New Text"

Поэтому, когда я применяю эти знания к вашему коду. Это будет выглядеть примерно так.

from tkinter import*

class MyGUI:
   def __init__(self):
    self.__mainWindow = Tk()
    #self.fram1 = Frame(self.__mainWindow)
    self.labelText = 'Enter amount to deposit'
    self.depositLabel = Label(self.__mainWindow, text = self.labelText)
    self.depositEntry = Entry(self.__mainWindow, width = 10)
    self.depositEntry.bind('<Return>', self.depositCallBack)
    self.depositLabel.pack()
    self.depositEntry.pack()

    mainloop()

  def depositCallBack(self,event):
    self.labelText["text"] = 'change the value'
    print(self.labelText)

myGUI = MyGUI()

Если это поможет, пожалуйста, дайте мне знать!