Обновление Python Tkinter Label? - PullRequest
0 голосов
/ 02 июля 2018

Я много искал, но не смог найти причину, по которой этот код не работает. Он должен рассчитывать время песни по введенным битам и тактам, но метка (Lb3) не обновляется командой mins.set () (выберите верхнюю кнопку в первом меню)

from tkinter import *

ana = Tk()
ana.title("Ana Menü")
ana.geometry("245x170")


def bpm():
    def brtb():
        equ = int(Eb1.get()) * 4 / int(Eb2.get())
        str(equ)
        mins.set(equ)
    bar = Tk()
    bar.title("Bar to BPM")
    bar.geometry("245x150")
    Lb1 = Label(bar, text="Bar:")
    Lb2 = Label(bar, text="Bpm:")
    Lb3 = Label(bar, textvariable=mins)
    Eb1 = Entry(bar, width=10)
    Eb2 = Entry(bar, width=10)
    Bb1 = Button(bar, text="Calculate", command=brtb)
    Lb1.place(relx=0.15, rely=.05)
    Lb2.place(relx=0.12, rely=.2)
    Lb3.place(relx=.25, rely=.5)
    Eb1.place(relx=0.4, rely=.05)
    Eb2.place(relx=0.4, rely=.2)
    Bb1.place(relx=.3, rely=.4)
    bar.update_idletasks()





    bar.mainloop()
def minu():
    print("hi")


mins=StringVar()
B1 = Button(ana, command=bpm, text="bar to min", width=123, height=5)
B1.pack()
B2 = Button(ana, command=minu, text="min to bar", width=122, height=5)
B2.pack()

ana.mainloop()

1 Ответ

0 голосов
/ 02 июля 2018

Это признак использования более одной Tk() в вашей программе. Вы можете использовать Tk() только один раз, все остальные окна должны быть созданы с помощью Toplevel(). Попробуйте это:

bar = Toplevel()

(Технически вы могли бы использовать Tk() более одного раза, но на самом деле не следует; по крайней мере, пока у вас нет хорошего понимания того, как это работает.)

Редактировать: у вашего кода есть другие проблемы:

  • Как упоминалось ранее: у вас должен быть только один вызов Tk и соответствующий вызов mainloop().
  • Вы никогда не должны вкладывать функции в другие функции (за исключением некоторых очень редких случаев).
  • Я знаю, что заманчиво использовать place(), но это должно быть последнее средство. Пусть tkinter вычислит, куда положить вещи, используя pack() и grid(). Используйте Рамки, чтобы сделать меньшие части, которые вы можете организовать. Использование place означает большую работу для вас, и ваш код не будет выглядеть одинаково на других компьютерах, и это делает код очень сложным в обслуживании.
  • Не используйте импорт подстановочных знаков (from module import *), это приводит к ошибкам и против PEP8.
  • Весь ваш код должен быть в функциях или классах, кроме одной точки входа внизу.
  • Вам никогда не нужно звонить update_idletasks().

Вот как бы я это написал. Даже если сейчас это кажется слишком сложным для вас, я рекомендую вам использовать этот шаблон и привыкнуть к нему; это очень поможет вам в будущем.

import tkinter as tk

class Bpm(tk.Toplevel):
    def __init__(self, master=None, **kwargs):
        tk.Toplevel.__init__(self, master, **kwargs)

        self.title("Bar to BPM")
        self.geometry("245x150")
        self.mins=tk.StringVar()

        entry_frame = tk.Frame(self)
        Lb1 = tk.Label(entry_frame, text="Bar:")
        Lb2 = tk.Label(entry_frame, text="Bpm:")
        self.Eb1 = tk.Entry(entry_frame, width=10)
        self.Eb2 = tk.Entry(entry_frame, width=10)
        Bb1 = tk.Button(self, text="Calculate", command=self.brtb)
        Lb3 = tk.Label(self, textvariable=self.mins)
        Lb1.grid(row=0, column=0, sticky='e')
        Lb2.grid(row=1, column=0, sticky='e')
        self.Eb1.grid(row=0, column=1)
        self.Eb2.grid(row=1, column=1)
        entry_frame.pack()
        Bb1.pack()
        Lb3.pack()

    def brtb(self):
        equ = int(self.Eb1.get()) * 4 / int(self.Eb2.get())
        self.mins.set(equ)

def minu():
    print("hi")

def main():
    ana = tk.Tk()
    ana.title("Ana Menü")
    ana.geometry("245x170")

    B1 = tk.Button(ana, command=Bpm, text="bar to min", width=123, height=5)
    B1.pack()
    B2 = tk.Button(ana, command=minu, text="min to bar", width=122, height=5)
    B2.pack()

    ana.mainloop()

if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...