首页 > 解决方案 > 通过另一个框架功能更改框架中的按钮属性 - tkinter

问题描述

我对 python 和 tkinter 完全陌生,因此我想向某人寻求帮助。我准备了一个带有多帧 tkinter 应用程序的 GUI 应用程序。我的问题是我想更改 btn1 属性,例如通过在 frame2 中按下 btn2 来更改 frame1 中的背景,这不是工作,我非常沮丧问题出在哪里这是我的代码

#-----------------------------------------------------------

from tkinter import *
import tkinter as tk            

state=0

class SmartApp(tk.Tk):
    def __init__(self, *args,**kwargs):
       tk.Tk.__init__(self,*args,**kwargs)
       tk.Tk.wm_geometry(self,"800x480")
 
       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.frames= {}  #dictionary for frames, contain the list of frames
       for frames in (Frame1,Frame2):
          page_name=frames.__name__
          frame=frames(parent=container,controller=self)
          self.frames[page_name]=frame
          frame.grid(row=0,column=0 , sticky="nsew") #
    self.show_frame("Frame1")

def show_frame(self,cont):
    frame=self.frames[cont]
    frame.tkraise() # raise to the front


class Frame1(tk.Frame):
def __init__(self,parent,controller):
    tk.Frame.__init__(self,parent)
    self.controller=controller
    global state

    label=tk.Label(self,text="Frame1")
    label.place(x=50,y=50)

    btn_1=tk.Button(self,text="go to Frame2", command=lambda:controller.show_frame("Frame2"))
    btn_1.place(x=500,y=200)


    if state==1:
        btn_1.configure(bg='green') # this I wolud reach

class Frame2(tk.Frame):
def __init__(self,parent,controller):
    tk.Frame.__init__(self,parent)
    self.controller=controller

    right_frame=tk.Frame(self,bg='#FF0000')
    right_frame.pack(side=RIGHT,expand=YES, fill=BOTH)

    left_frame = tk.Frame(self, bg='#00FF00')
    left_frame.pack(side=LEFT, expand=YES, fill=BOTH)

    main_menu_btn = tk.Button(right_frame, text="back to Frame1", command=self.hide)
    main_menu_btn.place(x=240, y=300)
    

    btn_2=tk.Button(right_frame, text="Change",command=lambda:self.activate) # with this I would like to change btn_1 background
    btn_2.grid(row=0, rowspan=2, column=3)

def activate(self):
    global state
    state=1
    return (state)
    
def hide(self):
    self.controller.show_frame("Frame1")


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

标签: pythonuser-interfacetkinterbuttonframe

解决方案


尝试这个:

import tkinter as tk


class SmartApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        super().wm_geometry("800x480")
 
        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.frames = {}  #dictionary for frames, contain the list of frames
        for Frame in (Frame1, Frame2):
            frame = Frame(container, controller=self)
            frame.grid(row=0, column=0, sticky="news")
            self.frames.update({Frame.__name__: frame})
        self.show_frame("Frame1")

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise() # raise to the front


class Frame1(tk.Frame):
    def __init__(self, master, controller):
        super().__init__(master)
        self.controller = controller

        self.label = tk.Label(self, text="Frame1")
        self.label.place(x=50, y=50)

        self.btn_1 = tk.Button(self, text="go to Frame2",
                          command=lambda: controller.show_frame("Frame2"))
        self.btn_1.place(x=500, y=200)


    def change_btn_bg(self):
        self.btn_1.configure(bg="green")


class Frame2(tk.Frame):
    def __init__(self, master, controller):
        super().__init__(master)
        self.controller = controller

        right_frame = tk.Frame(self, bg="#FF0000")
        right_frame.pack(side="right", expand=True, fill="both")

        left_frame = tk.Frame(self, bg="#00FF00")
        left_frame.pack(side="left", expand=True, fill="both")

        main_menu_btn = tk.Button(right_frame, text="back to Frame1",
                                  command=self.hide)
        main_menu_btn.place(x=240, y=300)

        btn_2 = tk.Button(right_frame, text="Change",
                          command=self.activate)
        btn_2.grid(row=0, rowspan=2, column=3)

    def activate(self):
        # Call Frame1's `change_btn_bg` method
        self.controller.frames["Frame1"].change_btn_bg()
        
    def hide(self):
        self.controller.show_frame("Frame1")


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

首先,我清理了你的代码。其次,您只检查了state一次的值。如果您直接调用正确的方法,则不必使用标志。


推荐阅读