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