带类的Python Tkinter
尝试开发一个工作应用程序,我希望将UI和主控制器类代码分开。我应该如何处理这个问题 我已经创建了MainUi类带类的Python Tkinter,python,python-3.x,oop,tkinter,Python,Python 3.x,Oop,Tkinter,尝试开发一个工作应用程序,我希望将UI和主控制器类代码分开。我应该如何处理这个问题 我已经创建了MainUi类 class MainUi: store_number = '' tld_date = '' def __init__(self, root): self.root = root root.title("TacoBell TLD Tool") self.store_number = IntVar() self.tld_date = IntVar()
class MainUi:
store_number = ''
tld_date = ''
def __init__(self, root):
self.root = root
root.title("TacoBell TLD Tool")
self.store_number = IntVar()
self.tld_date = IntVar()
self.lblstore_number = Label(root, text="Store Number (XXXXXX): ")
self.lbltld_date = Label(root, text="TLD Date(MM/DD/YYYY): ")
self.lblstore_number.grid(row=0, sticky=E) # Sticky align text North(N), East(E), South(S), West(W0
self.lbltld_date.grid(row=1, sticky=E)
self.entStore = Entry(self.root, textvariable=self.store_number)
self.entDate = Entry(self.root, textvariable=self.tld_date)
self.entStore.grid(row=0, column=1)
self.entDate.grid(row=1, column=1)
我需要定义getter和setter吗?我希望这些入口存储在main类的两个变量中,这样我就可以将main类中的变量传递给其他函数
import paramiko
import os
import csv
import tools
from ui import MainUi
from tkinter import *
root = Tk()
ui = MainUi(root)
# get store number and date data from UI.py and store them as variables here
root.mainloop()
是的,您可以通过更改类变量
store\u number
和tld\u date
将它们分开。为此,您需要从入口框中获取数字并将其保存为变量。我们可以通过调用self.store\u number=self.entStore.get()
或self.tld\u date=self.entDate.get()
MainUI.py
我首先更改了类的名称,这样文件名和类名就不会冲突。然后我创建了一个名为self.confirm
的按钮,并将其命令设置为self.save
。此函数将两个变量存储为storeNumber
和tldDate
,然后将类变量设置为已输入的值并销毁根窗口
Controller.py
因为我们销毁了根实例,所以返回了mainloop()
函数,这意味着它下面的任何代码都将运行。只要UI是打开的,它下面的代码就不会运行。因此,当根窗口关闭时,它下面的代码将运行,并保存这两个变量供以后使用。您应该在注释掉的地方添加一些错误检查代码
使用.pack() 我个人不使用
.grid()
,因为is可能会有点混乱。相反,我喜欢使用.pack()
和封装。如果您想改用.pack()
的话,这里有另一个\uuuu init\uuuu
的工作原理是一样的。我还使GUI在这个\uuuu init\uuuuu
上看起来不那么标准,并使用了一些TacoBell颜色:)
最好的方法是使用组件。使用tkinter,您应该通过扩展
Frame
类来定义组件。因此,您的代码应该如下所示:
class StoreForm(tkinter.Frame):
store_number = ''
tld_date = ''
def __init__(self, root, **kw):
super().__init__(**kw)
root.title("TacoBell TLD Tool")
self.store_number = tkinter.IntVar()
self.tld_date = tkinter.IntVar()
self.lblstore_number = tkinter.Label(self, text="Store Number (XXXXXX): ")
self.lbltld_date = tkinter.Label(self, text="TLD Date(MM/DD/YYYY): ")
self.lblstore_number.grid(row=0, sticky=E) # Sticky align text North(N), East(E), South(S), West(W0
self.lbltld_date.grid(row=1, sticky=E)
self.entStore = tkinter.Entry(self, textvariable=self.store_number)
self.entDate = tkinter.Entry(self, textvariable=self.tld_date)
self.entStore.grid(row=0, column=1)
self.entDate.grid(row=1, column=1)
注意,root
参数不是您的根,而是此框架的预期容器
这样,您就拥有了一个独立的可重用图形组件。该组件管理视图逻辑(显示小部件,如果需要,它们之间的交互),但不管理应用程序逻辑,这是控制器的工作。但要使用该控制器,您应该能够从该组件获取数据和/或提供一些数据。为此,您应该添加方法。即使我使用相似的名字,我也不会称他们为接受者和接受者
def get_data(self):
return self.store_number.get(), self.tld_date.get()
def set_data(self, store_number_value, tld_date_value):
self.store_number.set(store_number_value)
self.tld_date.set(tld_date_value)
现在,在主模块中,您可以添加如下内容
MAIN_UI = tkinter.Tk()
form = StoreForm(MAIN_UI).pack()
我让您选择是在模块的根目录下还是在类中进行。这是控制器应该在的地方。控制器是您的业务逻辑位于图形组件之外的组件
使用框架可以:
- 将UI逻辑与业务逻辑分开
- 混合布局(表格框架中的网格,组件流的包装外部)
class StoreForm(tkinter.Frame):
store_number = ''
tld_date = ''
def __init__(self, root, **kw):
super().__init__(**kw)
root.title("TacoBell TLD Tool")
self.store_number = tkinter.IntVar()
self.tld_date = tkinter.IntVar()
self.lblstore_number = tkinter.Label(self, text="Store Number (XXXXXX): ")
self.lbltld_date = tkinter.Label(self, text="TLD Date(MM/DD/YYYY): ")
self.lblstore_number.grid(row=0, sticky=E) # Sticky align text North(N), East(E), South(S), West(W0
self.lbltld_date.grid(row=1, sticky=E)
self.entStore = tkinter.Entry(self, textvariable=self.store_number)
self.entDate = tkinter.Entry(self, textvariable=self.tld_date)
self.entStore.grid(row=0, column=1)
self.entDate.grid(row=1, column=1)
def get_data(self):
return self.store_number.get(), self.tld_date.get()
def set_data(self, store_number_value, tld_date_value):
self.store_number.set(store_number_value)
self.tld_date.set(tld_date_value)
MAIN_UI = tkinter.Tk()
form = StoreForm(MAIN_UI).pack()