Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从函数而不是按钮命令调用Tkinter帧控制器_Python_Model View Controller_Tkinter - Fatal编程技术网

Python 从函数而不是按钮命令调用Tkinter帧控制器

Python 从函数而不是按钮命令调用Tkinter帧控制器,python,model-view-controller,tkinter,Python,Model View Controller,Tkinter,因此,我有以下几点,非常有效: import tkinter as tk class App(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) container = tk.Frame(self) container.pack(side="top", fill="both", expand=True) co

因此,我有以下几点,非常有效:

import tkinter as tk

class App(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        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 = {}
        for F in (LoginPage, ProjPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, rowspan=12, columnspan=6, sticky="nsew")

        self.show_frame(LoginPage)

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

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

        Btn = tk.Button(self, text="Sign In", command=lambda: controller.show_frame(ProjPage))
但我希望最后一个按钮命令位于单独的函数中,因此我可以先进行一些计算:

        Btn = tk.Button(self, text="Sign In", command=self.signIn)

    def signIn(self):
        # do some stuff here
        self.controller.show_frame(ProjPage)
这不管用;无论我是否尝试通过控制器,或使用lambda,似乎都没有任何效果><
我没有得到什么?

您似乎没有在
self
中初始化
控制器。将它放在
登录页面
初始化
中,如下所示:

self.controller = controller
我的程序有一个页面(主页),其中有5个单选按钮和一个“ok”按钮,我还有5个其他框架。我希望我的程序在单击“确定”(基于所选单选按钮)后转到这些帧

单击“确定”时,它将调用lambda并获取所选radiobutton的值,并根据该值查找表示页面名称的字符串(veg)

代码如下:

将tkinter作为tk导入 从tkinter导入ttk 从Win32打印导入起始页

KBSapp类(tk.tk): definit(self,*args,**kwargs): tk.tk.init(self,*args,**kwargs) tk.tk.iconbitmap(self,default=“icon.ico”) tk.tk.wm_标题(self,“蔬菜作物的病虫害”) 容器=tk.Frame(自身,宽度=200,高度=200,背景为黑色) container.pack(side=“top”,fill=“both”,expand=True) container.grid_rowconfigure(0,权重=1) container.grid\u column配置(0,权重=1)

类起始页(传统框架): definit(自身、父级、控制器): tk.Frame.init(自,父)

def OK点击(v): 全球蔬菜 input1=v.get() 如果input1==1: veg=“胡萝卜” 如果输入1==2: 蔬菜、芹菜 如果输入1==3: 蔬菜和土豆 如果输入1==4: 蔬菜和小麦 如果输入1==5: 菜豆 印刷品(蔬菜)

胡萝卜类(传统框架): definit(自身、父级、控制器): tk.Frame.init(自,父) 标签=tk.标签(自身,宽度=0,高度=20) 标签。包装() button3=ttk.Button(self,command=lambda:controller.show_frame(芹菜),text='celery',width=25) 按钮3.包装()

芹菜类(传统框架): definit(自身、父级、控制器): tk.Frame.init(自,父) 标签=tk.标签(自身,宽度=0,高度=20) 标签。包装() button4=ttk.Button(self,command=lambda:controller.show_frame(土豆),text='potato',width=25) 按钮4.包装()

马铃薯类(tk.框架): definit(自身、父级、控制器): tk.Frame.init(自,父) 标签=tk.标签(自身,宽度=0,高度=20) 标签。包装() button4=ttk.Button(self,command=lambda:controller.show_frame(小麦),text='小麦',width=25) 按钮4.包装()

小麦类(传统框架): definit(自身、父级、控制器): tk.Frame.init(自,父) 标签=tk.标签(自身,宽度=0,高度=20) 标签。包装() button4=ttk.Button(self,command=lambda:controller.show_frame(bean),text='bean',width=25) 按钮4.包装()

类bean(tk.Frame): definit(自身、父级、控制器): tk.Frame.init(自,父) 标签=tk.标签(自身,宽度=0,高度=20) 标签。包装() button4=ttk.Button(self,command=lambda:controller.show_帧(起始页),text='StartPage',width=25) 按钮4.包装()

app=KBSapp()
app.mainloop()

Omg太简单了!非常感谢!
    self.frames = {}

    for F in (StartPage,carrot,celery, potato, wheat, bean):
        frame = F(container, self)
        self.frames[F] = frame
        frame.grid(row=0, column=0, sticky="nsew")

    self.show_frame(StartPage)

def show_frame(self, cont):
    frame = self.frames[cont]
    frame.tkraise( )
    label = tk.Label(self, width=0, height=20)
    label.pack()

    button2 = ttk.Button(self, command=lambda : okclick(v) ,text='OK', width=25)
    button2.pack( )

    v = tk.IntVar( )
    self.option1 = ttk.Radiobutton(self,  text="Carrot", variable=v, value=1);self.option1.pack( )
    self.option2 = ttk.Radiobutton(self,  text="Celery", variable=v, value=2);self.option2.pack( )
    self.option3 = ttk.Radiobutton(self,  text="potato", variable=v, value=3);self.option3.pack( )
    self.option4 = ttk.Radiobutton(self,  text="wheat", variable=v, value=4);self.option4.pack( )
    self.option5 = ttk.Radiobutton(self,  text="bean", variable=v, value=5);self.option5.pack( )
    v.set(1)  # initializing the choice