从 method/function 内部更改 tkinter 框架而不是 __init__
Changing a tkinter frame from inside a method/function other than __init__
我想做的是找到一种方法来改变 method/function 的框架而不是 def __init__
我用来更改和管理框架的主要 class 是:
class ShopCounter(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 i in (PageOne, PageTwo):
frame = i(container, self)
self.frames[i] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.showFrame(Login)
def showFrame(self, cont):
frame = self.frames[cont]
frame.tkraise()
我从这里遇到的问题是,当我制作一个新的 window 例如
class PageOne (tk.Frame):
def __init__ (self, parent, controller):
tk.Frame.__init__(self, parent)
lbl = tk.Label(self, text="Page 1")
lbl.pack()
这也在__init__
因为这会调用 nextPage 函数(稍后显示)
下一页()
但我需要从 CSV 传播中读取 sheet 来检查此人是否输入了用户名和密码(为了方便没有输入检查代码或输入字段)然后我发现我需要从 class PageOne
中的不同函数更改框架
然后我遇到了一个问题,现在必须在调用函数时通过函数的括号在这个新函数中定义一个控制器,这是一个问题,因为我不知道该怎么做,除了将其作为 __init__ 方法
中的参数
快速示例:
说class中的函数是这样的..
def nextPage (self, controller):
controller.showFrame(PageTwo)
IDLE 然后告诉我这个函数 "controller" 的参数丢失了,但我不知道如何手动设置它
我找到了修复方法
class PageOne (tk.Frame):
def __init__ (self, parent, controller):
tk.Frame.__init__(self, parent)
lbl = tk.Label(self, text="Page 1")
lbl.pack()
button = tk.Button(self, text="switch", command=lambda: self.launch(controller)
button.pack()
def launch (self, cont):
cont.showFrame(PageTwo)
现在我在 PageOne class 中创建了一个函数(启动),它将 self 和 cont(控制器)作为参数。然后,您将在按下按钮时将控制器从 init 传递到启动函数中。
希望这对您有所帮助。因为就我个人而言,几个月来我一直被这个问题难倒。
更新
这个答案出现几个月后,我现在找到了一种新方法,而不是总是将控制器作为参数传递给您在每个页面中使用的每个函数 class,在开始时class (__ init __),你可以为持有控制器的对象声明一个变量,这里是一个例子:
class PageTwo(tk.Frame):
def __init__ (self, parent, controller):
self.controller = controller
def doSomething (self):
self.controller.doSomething()
通过引用控制器,您可以 运行 控制器 class 中的任何 class,您还可以获取变量数据并进行更改。
我想做的是找到一种方法来改变 method/function 的框架而不是 def __init__
我用来更改和管理框架的主要 class 是:
class ShopCounter(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 i in (PageOne, PageTwo):
frame = i(container, self)
self.frames[i] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.showFrame(Login)
def showFrame(self, cont):
frame = self.frames[cont]
frame.tkraise()
我从这里遇到的问题是,当我制作一个新的 window 例如
class PageOne (tk.Frame):
def __init__ (self, parent, controller):
tk.Frame.__init__(self, parent)
lbl = tk.Label(self, text="Page 1")
lbl.pack()
这也在__init__ 因为这会调用 nextPage 函数(稍后显示) 下一页()
但我需要从 CSV 传播中读取 sheet 来检查此人是否输入了用户名和密码(为了方便没有输入检查代码或输入字段)然后我发现我需要从 class PageOne
中的不同函数更改框架然后我遇到了一个问题,现在必须在调用函数时通过函数的括号在这个新函数中定义一个控制器,这是一个问题,因为我不知道该怎么做,除了将其作为 __init__ 方法
中的参数快速示例:
说class中的函数是这样的..
def nextPage (self, controller):
controller.showFrame(PageTwo)
IDLE 然后告诉我这个函数 "controller" 的参数丢失了,但我不知道如何手动设置它
我找到了修复方法
class PageOne (tk.Frame):
def __init__ (self, parent, controller):
tk.Frame.__init__(self, parent)
lbl = tk.Label(self, text="Page 1")
lbl.pack()
button = tk.Button(self, text="switch", command=lambda: self.launch(controller)
button.pack()
def launch (self, cont):
cont.showFrame(PageTwo)
现在我在 PageOne class 中创建了一个函数(启动),它将 self 和 cont(控制器)作为参数。然后,您将在按下按钮时将控制器从 init 传递到启动函数中。
希望这对您有所帮助。因为就我个人而言,几个月来我一直被这个问题难倒。
更新
这个答案出现几个月后,我现在找到了一种新方法,而不是总是将控制器作为参数传递给您在每个页面中使用的每个函数 class,在开始时class (__ init __),你可以为持有控制器的对象声明一个变量,这里是一个例子:
class PageTwo(tk.Frame):
def __init__ (self, parent, controller):
self.controller = controller
def doSomething (self):
self.controller.doSomething()
通过引用控制器,您可以 运行 控制器 class 中的任何 class,您还可以获取变量数据并进行更改。