【问题标题】:Updating tkinter label in a frame object更新框架对象中的 tkinter 标签
【发布时间】:2020-08-31 20:17:21
【问题描述】:

我一直在努力通过结合书籍、在线教程以及利用本网站上的问题和示例来提高我的 Tkinter 技能。在一个脚本中,我正在努力理解和建立这个问题和流行的答案: Switch between two frames in tkinter。 我创建了一个版本,该版本允许创建页面的多个实例,跟踪为每个实例选择第 1 页的时间次数,并使用选择第 1 页的次数更新第 1 页的标签。为了减小程序的大小,显示的代码仅用于更新第 1 页标签。我只能通过在“PageOne”对象中使用全局变量和调用来显示它的方法来实现这一点。我觉得 必须有更好的方法,但我尝试的所有方法都会产生类似的错误 to : #AttributeError: '_tkinter.tkapp' object has no attribute 'label'。我想应该很简单,但我花了几天时间单独解决这个问题。


import tkinter as tk                
from tkinter import font as tkfont  
'''
original post
https://stackoverflow.com/questions/7546050/switch-between-two-frames-in-tkinter
'''


class SampleApp(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        #-------------------------------    
        self.Label1_Text = tk.StringVar()
        self.PageOne_Ct = tk.IntVar()
        #-------------------------------
        self.frames = {}
        for F in (StartPage, PageOne, PageTwo):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame("StartPage")
        
    def get_lbl_text(self):
        label1text = self.Label1_Text.get()
        return label1text

    def get_page1_cts(self):
        counts = self.PageOne_Ct.get() 
        return counts     

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()

class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label = tk.Label(self, text="This is the start page", font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)
        button1 = tk.Button(self, text="Go to Page One",
                            command=lambda: PageOne.Show_PageOne(self, 
                            parent, controller))
        button2 = tk.Button(self, text="Go to Page Two",
                            command=lambda: controller.show_frame("PageTwo"))
        button1.pack()
        button2.pack()

class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        global label
        self.controller = controller
        label = tk.Label(self, text = self.controller.Label1_Text.get(),
                              font=controller.title_font)
        label.pack(side="top", fill="x", pady=10)
        button = tk.Button(self, text="Go to the start page",
                            command=lambda: controller.show_frame("StartPage"))
        button.pack()

    def Show_PageOne(self, parent, controller):
        
        global label   
        count = self.controller.get_page1_cts()
        self.controller = controller
        count = self.controller.PageOne_Ct.get()
        count += 1
        self.controller.PageOne_Ct.set(count)
        new_label1_text = "You have clicked page one {} times".format(count)
        self.controller.Label1_Text.set(new_label1_text)
        label.configure(text=new_label1_text)
        controller.show_frame("PageOne")

class PageTwo(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        label2 = tk.Label(self, text="This is page 2", font=controller.title_font)
        label2.pack(side="top", fill="x", pady=10)
        button = tk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        button.pack()

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

【问题讨论】:

    标签: python object tkinter text


    【解决方案1】:

    这是一个不需要传递一堆变量的示例。

    import tkinter as tk
    
    
    '''
        PREVIOUS|NEXT DISPLAY FOR PAGES
    '''
    class Book:
        def __init__(self, master, pages):
            #init page vars
            self.pnum  = 0 
            self.pages = pages
            self.page  = self.pages[self.pnum].show()
            
            #next/prev buttons
            tk.Button(master, text='prev', command=self.prev).place(relx=.05, rely=.95, anchor='center')
            tk.Button(master, text='next', command=self.next).place(relx=.95, rely=.95, anchor='center')
            
        def next(self):
            self.page.hide()
            self.pnum = (self.pnum+1)%len(self.pages)
            self.page = self.pages[self.pnum].show()
            
        def prev(self):
            self.page.hide()
            self.pnum = range(len(self.pages))[self.pnum-1]
            self.page = self.pages[self.pnum].show()
    
    
    '''
        GENERIC PAGE FOR ALL PAGES TO INHERIT FROM
    '''
    class Page(tk.Frame):
        def __init__(self, master, **kwargs):
            tk.Frame.__init__(self, master, **kwargs)
            self.visits = 0
            self.label = tk.Label(self, text=f'visits: {self.visits}', font='consolas 16 bold', fg='white', bg=self['bg'])
            self.label.grid()
            
        def show(self) -> tk.Frame:
            self.visits += 1
            self.label.configure(text=f'visits: {self.visits}')
            self.grid(row=0, column=0, sticky='nswe')
            return self
            
        def hide(self):
            self.grid_forget()
            
            
    '''
        EXAMPLE PAGES
    '''        
    class Page_1(Page):
        def __init__(self, master, **kwargs):
            Page.__init__(self, master, **kwargs)
            
         
    class Page_2(Page):
        def __init__(self, master, **kwargs):
            Page.__init__(self, master, **kwargs)
        
    
    class Page_3(Page):
        def __init__(self, master, **kwargs):
            Page.__init__(self, master, **kwargs)
            
            
    '''
        ROOT
    '''
    class Root(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            self.title("Pages Example")
            self.geometry('800x600+100+100')
            
            #make the page span the entire display
            self.grid_columnconfigure(0, weight=1)
            self.grid_rowconfigure(0, weight=1)
            
            #create book
            Book(self, [Page_1(self, bg='blue') , 
                        Page_2(self, bg='red')  , 
                        Page_3(self, bg='green'),
                       ])
            
            self.mainloop()
            
    
    Root() if __name__ == "__main__" else None
        
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-13
      • 2017-01-27
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      相关资源
      最近更新 更多