首页 > 解决方案 > 在 Tkinter 中重叠不同的帧

问题描述

我正在尝试制作一个计算器,它具有不同的框架,即基本、统计、...等。但是,我在显示每个框架时遇到了问题。

这是所有框架的容器(我以上一篇文章的代码为例)

import tkinter as tk

class calculatorframe(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        #----------------CONTAINER FOR ALL THE FRAMES----------
        container = tk.Frame(self)
        container.pack()
        #--------------------- DROPDOWN MENU------------------

        tkvar = tk.StringVar()
        choices={'Basic Mode','Calculus Mode'} #Options of the dropdown menu
        tkvar.set('Basic Mode') #default frame
        dropdownmenu =tk.OptionMenu(container, tkvar, *choices)
        dropdownmenu.grid(row=2,column=3) #position of the dropdown menu

        self.frames = {}


        for F in (Basic, Calculus):
            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('Basic')

    #-------FUNCTION TO SHOW THE CURRENT FRAME

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

这些是我为基本计算器创建的类

class Basic(tk.Frame):

    def __init__(self, parent, controller):
        #--------------- SCREEN ---------------
        tk.Frame.__init__(self, parent)
        screen = tk.Entry(self, width=80)  
        screen.grid(row=3, column=1,columnspan=7) #position of the screen
        #------------ BUTTON ---------------------
        button7=tk.Button(self, text="7", width=8)  #button
        button7.grid(row=4,column=1)
#---------------------frame for calculus -------------------------
class Calculus(tk.Frame):
    def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            #-----------------------------SCREEN------------
            screen=tk.Entry(self, width=50)
            screen.pack()
            screen.grid(row=3, column=1, pady=20, columnspan=7) #position of the screen
            #------------------------BUTTON---------------
            go=tk.Button(self, height=1, text="Go") #button
            go.grid(row=1, column=8)


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

我知道我必须跟踪 tkvar 的值,并且我需要使用 trace() 来执行此操作并将该值传递给 show_frame,但是,我不知道将它放在我的代码中的哪个位置。我试图把它放在下拉菜单下面,但我收到一条错误消息,我在函数 show_frame 之后尝试了它,它也没有工作。我有点卡住了,非常感谢您的帮助,在此先感谢。

标签: pythontkinterdrop-down-menuoverlap

解决方案


简单的解决方案是将命令添加到您的OptionsMenu()函数中。由于命令参数在此处的工作方式,我们还需要更改您的类名和您的选择选项。

对于OptionsMenu()命令参数,当您告诉它调用方法时,它将自动传递下拉列表中所选项目的值。因此,正因为如此,我们需要确保我们的选择反映了类名。您可以将选项/类更改为您希望我刚刚使用的任何内容,BasicModeCalculusMode作为示例。

该命令将自动传递选择的值,因此我们可以使用它来使用您的show_frame方法调用每一帧。

看看下面的代码,如果您有任何问题,请告诉我。

import tkinter as tk


class calculatorframe(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        container.pack()

        tkvar = tk.StringVar()
        choices = {'BasicMode', 'CalculusMode'}
        tkvar.set('BasicMode')
        dropdownmenu = tk.OptionMenu(container, tkvar, *choices, command=self.show_frame)
        dropdownmenu.grid(row=2, column=3)

        self.frames = {}

        for F in (BasicMode, CalculusMode):
            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('BasicMode')

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()


class BasicMode(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        screen = tk.Entry(self, width=80)  
        screen.grid(row=3, column=1, columnspan=7)

        button7 = tk.Button(self, text="7", width=8)
        button7.grid(row=4,column=1)


class CalculusMode(tk.Frame):
    def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            screen = tk.Entry(self, width=50)
            screen.pack()
            screen.grid(row=3, column=1, pady=20, columnspan=7)
            go = tk.Button(self, height=1, text="Go")
            go.grid(row=1, column=8)


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

推荐阅读