我目前有一个tkinter应用程序,其中有一个窗口,上面有很多按钮。
仅作为一个片段,代码大致为:
import tkinter as tk
def openWindow():
window = tk.Toplevel(root)
root = tk.tk()
~ ~ ~ ~
root.mainloop()
使用openWindow()函数生成的窗口可能会与我的主程序一起成为一个非常复杂的窗口。我没有一个非常大的python文件,如果我有另一个单独的python文件可以独立打开,或者导入我的主程序并在点击相应的按钮时打开它,我更喜欢它。
我到底该怎么做?
谢谢
答案 0 :(得分:2)
考虑为GUI的主要区域创建单独的类。
假设您有一个Label,Entry和Button小部件,其作用类似于文件选择小部件,当您单击按钮时,它会打开一个对话框来选择文件,然后在Entry字段中显示所选的文件路径。 所有这些代码可以一起存在,它定义了小部件的所有元素的行为和外观。
这可以作为独立的小部件实现,如下所示。
from tkinter import *
from tkinter import filedialog
class FileSelect(Frame):
def __init__(self,master,label="",**kw):
Frame.__init__(self,master)
self.configure(**kw)
self.file = StringVar()
self.Label = Label(self, text=label)
self.Label.config(width=10,anchor=E)
self.filenamebox = Entry(self,text=self.file)
self.filenamebox.config(width=50)
self.btnBrowse = Button(self,text='Browse',command=self.browse_file)
self.btnBrowse.config(width=10)
self.Label.grid(row=0,column=0,pady=5,sticky=E)
self.filenamebox.grid(row=0,column=1,pady=5)
self.btnBrowse.grid(row=0,column=2,pady=5,padx=5)
def browse_file(self):
filename = filedialog.askopenfilename(filetypes=[('All File','*.*')])
self.file.set(filename)
def get_filename(self):
return self.file.get()
def main():
root = Tk()
root.title("Example Widget")
FileSelect(root,label="My File").grid()
root.mainloop()
if __name__ == '__main__':
main()
我们还可以在GUI代码的更大部分中包含此功能。
from otherFile import FileSelect
....
fileSelect = FileSelect(root,label="Select New File")
fileSelect.grid()
(otherFile是包含FileSelect小部件的python文件的名称) 使用此方法,您可以在单独的代码文件中为GUI创建较小的代码段,并将其构建到更复杂的示例中。
如果您的代码部分执行"非gui"函数,例如读取文件,将它们放入可以导入主代码的单独函数或类中。
答案 1 :(得分:0)
部分答案:
尝试将“业务逻辑”分离到类和模块中,并将它们放入一个或多个.py
文件中。确保您的业务模块纯的一种方法是不到import tkinter
。
尝试将所有UI放在类和模块中,并使它们不受业务逻辑的影响。扫描您的代码以查找涉及计算和操作的任何行,并询问自己是否应该将这些代码行移到上面提到的类中。
要将每个UI文件大小保持在manage下,请将相关的小部件分组到您自己的tk.frame
子类中。这也允许您在将来的项目中重用这些代码。
我之前有过GUI恐惧症,但在tk
和ttk
学习和编码几周后,我设法创建了一个实际上在两个不相关的项目中重复使用的超级小工具。