【问题标题】:Switching frame automatically in Tkinter在 Tkinter 中自动切换帧
【发布时间】:2019-09-20 14:26:55
【问题描述】:

我知道已经回答了类似的问题,但我已经彻底阅读了这些问题并且无法为自己找到解决方案。

BMR_method 完成后,如果 if、elif 或 else 选项完成,我希望它自动加载新的类/框架:work。但我无法弄清楚如何做到这一点。我尝试添加self.show_frame(work) 的不同变体,还尝试向函数添加父/控制器参数,但它会告诉我我缺少位置参数或者 show_frame 方法不存在。请帮忙。

import tkinter as tk
from decimal import Decimal
import time

LARGE_FONT = ("Verdana", 12)

def gender():
    if var1.get() and var2.get():
        print('Please only tick one box')
        var1.set(0)
        var2.set(0)
    elif var1.get():
        print('Male')
        bmr_male()
    elif var2.get():
        print('Female')
        bmr_female()
    else:
        print('Please tick male or female')

class theog(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        controller = self
        container.pack(side='top', fill='both', expand= True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        self.frames = {}
        for F in (StartPage, BMR, work):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky='nsew')
        self.show_frame(StartPage)

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

class StartPage(tk.Frame):  
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Start Page", width = 60)
        label.pack()
        button = tk.Button(self, text="Begin!", 
            command=lambda: controller.show_frame(BMR))
        button.pack()

class BMR(tk.Frame):

    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="BMR Calculator", width = 20)
        label.grid(column=0, row=0, sticky='W')
        label_height = tk.Label(self, text="Height (CM)")
        label_height.grid(column=3, row=0, sticky='E')
        label_weight = tk.Label(self, text="Weight (KG)")
        label_weight.grid(column=3, row=1, sticky='E')        
        label_age = tk.Label(self, text="Age")
        label_age.grid(column=3, row=2, sticky='E')

        self.text_height = tk.Entry(self, width=20, bg="white")
        self.text_height.grid(row=0, column=4, sticky='W')
        self.text_weight = tk.Entry(self, width=20, bg="white")
        self.text_weight.grid(row=1, column=4, sticky='W')
        self.text_age = tk.Entry(self, width=20, bg="white")
        self.text_age.grid(row=2, column=4, sticky='W')

        self.resultvar = tk.StringVar()
        self.result = tk.Label(self, textvariable=self.resultvar)
        self.result.grid(row=3, column=1)

        self.var1 = tk.StringVar()
        self.var1.set(None)
        tk.Radiobutton(self, text="Male", bg='white', value='male', variable=self.var1).grid(row=0, column=1, sticky='S')
        tk.Radiobutton(self, text="Female", bg='white', value='female', variable=self.var1).grid(row=1, column=1, sticky='S')
        tk.Button(self, text="Submit!", width=6, command=self.bmr_method).grid(row=3, column=0, sticky='W')


    def bmr_method(self, Entry=None):
        if self.text_height.get() and self.text_weight.get() and self.text_age.get() and self.var1.get() == 'male':
            bh = float(self.text_height.get()) * 5.0033
            bw = float(self.text_weight.get()) * 13.7516
            ba = float(self.text_age.get()) * 6.7550
            bmr = float(66.4730 + bh + bw - ba)
            self.resultvar.set('Your BMR is: ' + str(bmr))

        elif self.text_height.get() and self.text_weight.get() and self.text_age.get() and self.var1.get() == 'female':
            bh = float(self.text_height.get()) * 1.8496
            bw = float(self.text_weight.get()) * 9.5634
            ba = float(self.text_age.get()) * 4.6756
            bmr = float(655.095 + bh + bw - ba).round(1)
            self.resultvar.set('Your BMR is:' + str(bmr) +'\n press continue to find out \n your maintenance calories')
        else:
            'Please ensure all information has been entered and click again'
            self.resultvar.set('Please ensure all \n information has been \n entered and click again')
        self.controller.show_frame(work) #I WANT TO OPEN THE CLASS BELOW AFTER THIS METHOD HAS FINISHED

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


root = theog()
root.mainloop()

【问题讨论】:

    标签: python tkinter frame


    【解决方案1】:

    首先,您的类需要接受并保存对控制器的引用,以便您以后可以访问它:

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

    然后,你只需要调用控制器方法show_frame

    self.controller.switch_frame(work)
    

    【讨论】:

    • 将控制器的引用保存在哪里?
    • @Remitto:在每个页面的__init__。例如,请参阅stackoverflow.com/questions/7546050/…
    • 很抱歉打扰,但我真的很挣扎。我不知道引用控制器的类型。我尝试了 self=controller 等,但没有任何区别。当我使用 self.controller.show_frame(work) 它告诉我我缺少位置参数。有什么地方可以发给你完整的代码吗?
    • 我已经添加了完整的代码,底部的代码是需要修复的。提前谢谢你
    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2018-07-17
    • 2020-10-10
    • 2011-11-24
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多