我想制作一個帶有多個視窗的 python tkinter 應用程式。
我希望能夠單擊其中一個視窗 ( message_button) 中的按鈕小部件 ( ) PageOne,并讓它在另一個視窗 ( PageTwo) 中使用標簽小部件列印一條訊息。
我已經用我的message_fun()(見下文)嘗試過,但我只能設法將標簽放在同一個視窗 ( PageOne) 中。
我也嘗試更改self為PageTwoin message_fun(),但這只會給我一條錯誤訊息AttributeError: type object 'PageTwo' has no attribute 'tk'。
謝謝你的幫助!
import tkinter as tk
from tkinter import ttk
class MyPages(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
self.frames = {}
for F in (PageOne, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(PageOne)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
title_label = tk.Label(self, text="This is page one", font=("Verdana", 12))
title_label.pack(pady=10,padx=10)
navigate_button = ttk.Button(self, text="Page Two", command=lambda: controller.show_frame(PageTwo))
navigate_button.pack(side = tk.LEFT)
message_button = ttk.Button(self, text="Message button", command= self.message_fun)
message_button.pack(side = tk.LEFT)
def message_fun(self):
message_label = tk.Label(self, text='I want this message in page two', font=("Verdana", 12))
message_label.pack(side = tk.LEFT)
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
title_label = tk.Label(self, text="This is page two", font=("Verdana", 12))
title_label.pack(pady=10,padx=10)
navigate_button = ttk.Button(self, text="Page one", command=lambda: controller.show_frame(PageOne))
navigate_button.pack(side = tk.LEFT)
app = MyPages()
app.mainloop()
uj5u.com熱心網友回復:
每個Page都作為第二個引數controller,它可以訪問MyPages和MyPages擁有frames可以訪問所有頁面的權限。
所以你應該首先在__init__keep controlleras self.controller,然后你可以使用self.controller.frames[PageTwo]訪問第一頁中的第二頁。
tk.Label(self.controller.frames[PageTwo], ...
import tkinter as tk
from tkinter import ttk
class MyPages(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
self.frames = {}
for F in (PageOne, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(PageOne)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
super().__init__(parent)
self.controller = controller
title_label = tk.Label(self, text="This is page one", font=("Verdana", 12))
title_label.pack(pady=10,padx=10)
navigate_button = ttk.Button(self, text="Page Two", command=lambda: controller.show_frame(PageTwo))
navigate_button.pack(side = tk.LEFT)
message_button = ttk.Button(self, text="Message button", command= self.message_fun)
message_button.pack(side = tk.LEFT)
def message_fun(self):
message_label = tk.Label(self.controller.frames[PageTwo], text='I want this message in page two', font=("Verdana", 12))
message_label.pack(side = tk.LEFT)
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
super().__init__(parent)
self.controller = controller
title_label = tk.Label(self, text="This is page two", font=("Verdana", 12))
title_label.pack(pady=10,padx=10)
navigate_button = ttk.Button(self, text="Page one", command=lambda: controller.show_frame(PageOne))
navigate_button.pack(side = tk.LEFT)
app = MyPages()
app.mainloop()
``
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/361392.html
