簡體   English   中英

Python:Tkinter 在新的 window 中打開自定義小部件

[英]Python: Tkinter open custom widget in new window

我的目標是生成一個帶有“NewWindow”按鈕的 window。 如果我按下按鈕,程序應該打開一個新的 window。我將這個 window 存儲在一個 class 的“NewWindow”中以快速重現它。 在這個“NewWindow”中,我有另一個按鈕。 如果我按下它,應該更新基本 window 的 label,並且應該自動關閉 window“NewWindow”。

這是我的代碼:

from tkinter import *

class NewWindow(Toplevel):
    def __init__(self, master = None):
        super().__init__(master = master)
        self.title('NewWindow')

        self.lb = Label(self, text='Hello')
        self.lb.grid(column=0, row=0, columnspan=1)

        self.bt1 = Button(self, text="apply Hello", command= self.bt_press)
        self.bt1.grid(column=0, row=1)
    def bt_press(self):
        window.basic_lb.text = "Hello"

window = Tk()

def new_Editor():
    a = NewWindow(window)

window.title("BasicWindow")
window.basic_lb = Label(window, text='None')
window.basic_lb.grid(column=0, row=0, columnspan=1)

window.basic_bt = Button(window, text="NewWindow", command=new_Editor)
window.basic_bt.grid(column=0, row=1)


window.mainloop()

問題:

  1. 開始時顯示 windows NewWindow 和 BasicWindow。 我只想打開 BasicWindow,單擊 basic_bt 按鈕后應打開 NewWindow。 我該如何解決? (已經通過下面的commed解決了)
  2. 為什么 basic_lb 中的 label 文本在按下 self.bt1 后沒有得到一些更新?
  3. 如何使用 bt_press 方法關閉 NewWindow?

您的代碼中有一些拼寫錯誤/錯誤導致了您的一些問題。 正如@Tim 所說,當您將 function 傳遞給command=function()之類的命令時,它將在運行時調用,而不是在按下按鈕時調用。 您需要將 function 句柄傳遞給命令command=function 您通過在按鈕命令中使用 lambda function 來解決這個問題,但是只使用command=self.bt_press會更容易

回答你的第二個問題, window.basic_lb.text = "Hello"不是你如何改變 tkinter Label中的文本,使用<Label>.config(text="Hello") 您還應該使用self.master並在__init__中定義self.master = master而不是僅使用window ,因為雖然您可以訪問window因為它沒有在本地 scope 中定義,所以最好顯式定義它。

您可以使用window.destroy()關閉 window。

您的工作代碼現在是:

from tkinter import *

class NewWindow(Toplevel):
    def __init__(self, master = None):
        super().__init__(master = master)
        self.title('NewWindow')
        self.master = master

        self.lb = Label(self, text='Hello')
        self.lb.grid(column=0, row=0, columnspan=1)

        self.bt1 = Button(self, text="apply Hello", command=self.bt_press)
        self.bt1.grid(column=0, row=1)
    def bt_press(self):
        self.master.basic_lb.config(text="Hello")
        self.destroy()

window = Tk()

def new_Editor():
    a = NewWindow(window)

window.title("BasicWindow")
window.basic_lb = Label(window, text='None')
window.basic_lb.grid(column=0, row=0, columnspan=1)

window.basic_bt = Button(window, text="NewWindow", command=new_Editor)
window.basic_bt.grid(column=0, row=1)

window.mainloop()

暫無
暫無

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

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