Перекрывают разные кадры в Ткинтере - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь сделать калькулятор, и он имеет разные фреймы, например, Базовый, Статистика, ... и т. Д. Однако у меня возникают проблемы с отображением каждого фрейма.

Это контейнер длявсе кадры (в качестве примера я взял код предыдущего поста)

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, и она тоже не работала.Я немного застрял, я был бы очень признателен за вашу помощь, спасибо заранее.

1 Ответ

0 голосов
/ 03 октября 2018

Простым решением было бы добавить команду к вашей функции OptionsMenu().Нам также потребуется изменить имена классов и параметры выбора из-за того, как здесь работает аргумент команды.

Для аргумента команды OptionsMenu(), когда вы указываете ему вызывать метод, он автоматически передает значениевыбранный элемент в раскрывающемся списке.Поэтому из-за этого нам нужно убедиться, что наш выбор отражает имена классов.Вы можете изменить выбор / классы так, чтобы они были такими, как вы хотите. Я просто использовал BasicMode и CalculusMode в качестве примера.

Команда автоматически передаст выбранное значение, поэтому мы можем использовать его для вызова каждого кадра с помощьюВы 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()
...