mrliu133 发表于 2022-12-21 22:15

如何实现tkinter的页面与逻辑分离

问题背景:
现在我有一个简单的的界面。一个输入框Entry,一个按钮Button。按钮功能为打开文件管理器,选择文件,然后在Entry中自动填充文件路径。
这个功能在一个py文件中很容易实现,如何在两个或者三个py文件中实现呢?就是一个py文件只显示界面,一个py文件只负责函数功能的完成,或者再加一个main.py。
至于为什么不在同一个py文件中去实现这个功能,是因为我有很多个功能函数,如果全部和界面写到一个py文件会显得很乱,不够简洁与优雅。
我现在就被困在了点了Button,函数开始执行之后,Entry中怎么进行insert输入呢?因为函数与界面不是在一个py文件里面,没有办法在执行函数的时候进行更多操作。
如果直接在界面中写个调用的函数,程序运行的时候就会直接执行了,而不是我点Button的时候才选择文件,显然是不符合逻辑的。




sqq3306 发表于 2022-12-21 23:08

这个我也不是很懂

gzsklsskszngc 发表于 2022-12-21 23:18

咱也不懂,用你原话问了一下AI,得到以下结果:
若要将打开文件管理器并将文件路径填充到单独文件中的函数分开,可以使用几种不同的方法:
[*]您可以在单独文件中的类中使用函数,并在主文件中实例化该类的对象。然后,可以将按钮的命令绑定到对象的方法。
例如:文件:filehandler.pyclass FileHandler:
    def open_file_manager_and_fill_entry(self, entry):
      # code to open file manager and fill in the file path
      entry.insert(0, file_path)

文件:main.pyfrom filehandler import FileHandler

# create an instance of FileHandler
fh = FileHandler()

# bind the button's command to the method of the FileHandler object
button.configure(command=lambda: fh.open_file_manager_and_fill_entry(entry))

[*]您可以使用单独文件中的函数并将其导入主文件。然后,您可以将按钮的命令绑定到函数。
例如:文件:filehandler.pydef open_file_manager_and_fill_entry(entry):
    # code to open file manager and fill in the file path
    entry.insert(0, file_path)
文件:main.pyfrom filehandler import open_file_manager_and_fill_entry

# bind the button's command to the function
button.configure(command=lambda: open_file_manager_and_fill_entry(entry))

[*]您可以使用单独文件中的函数并将其导入主文件。然后,您可以在主文件中创建一个包装函数,该函数调用导入的函数,并将按钮的命令绑定到包装函数。
例如:文件:filehandler.pydef open_file_manager_and_fill_entry(entry):
    # code to open file manager and fill in the file path
    entry.insert(0, file_path)
文件:main.pyfrom filehandler import open_file_manager_and_fill_entrydef wrapper_function():    open_file_manager_and_fill_entry(entry)# bind the button's command to the wrapper functionbutton.configure(command=wrapper_function)
这些只是如何将函数分离到一个单独的文件中并且仍然能够从主文件调用它的几个示例。您可以选择最适合您的特定用例的方法。

fugeda46 发表于 2022-12-21 23:24

你可以考虑在你的界面 py 文件中定义一个回调函数,将这个回调函数绑定到你的 Button 上,然后在回调函数中调用你要在另一个 py 文件中实现的功能函数。

举个例子,假设你有一个叫做 function.py 的文件,其中定义了一个叫做 select_file 的函数,这个函数的作用是打开文件管理器,选择文件,然后返回文件路径。

然后在你的界面 py 文件中,你可以定义一个回调函数,如下所示:
from tkinter import *
from function import select_file

def callback():
    file_path = select_file()
    entry.insert(0, file_path)

root = Tk()
entry = Entry(root)
entry.pack()

button = Button(root, text="Select File", command=callback)
button.pack()

root.mainloop()


在这里,我们在界面 py 文件中引入了 function.py 文件,然后定义了一个回调函数 callback。我们将这个回调函数绑定到 Button 上,当用户点击 Button 时,会执行这个回调函数。在回调函数中,我们调用了 function.py 中的 select_file 函数,获取文件路径,然后将文件路径插入到 Entry 中。

这样,你就可以在两个或者三个 py 文件中实现界面和逻辑的分离了。

akillking 发表于 2022-12-22 06:23

支持原创,感谢分享

土鸡炖蘑菇 发表于 2022-12-22 08:48

用qt行吗?   不过qt和tk也是同理的,就是tk的代码我不懂怎么写,我都是用qt做界面。    我手上有个软件一个主界面,两个子窗口一共4个py文件外加两个资源文件   打包成的。   

apull 发表于 2022-12-22 08:49

参数传递不香吗?

Maviso 发表于 2022-12-22 09:11

支持支持,感谢大佬分享

jcgogo 发表于 2022-12-22 09:14

感觉把函数传参就可以实现这样的功能

V_wtfk365 发表于 2022-12-22 09:19

from import
页: [1] 2
查看完整版本: 如何实现tkinter的页面与逻辑分离