簡體   English   中英

Python Tkinter標簽更新?

[英]Python Tkinter Label Update?

我搜索了很多,但找不到該代碼無法正常工作的原因。 它應該通過輸入的bpm和bar計算歌曲的時間,但是Label(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()

這是在程序中使用多個Tk()的症狀。 您只能使用Tk()一次,所有其他窗口必須使用Toplevel()創建。 嘗試這個:

bar = Toplevel()

(從技術上講,您可以多次使用Tk() ,但實際上不應該使用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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM