python 导入模块中的tkinter按钮:如何更新主模块窗口

sq1bmfud  于 2023-04-28  发布在  Python
关注(0)|答案(1)|浏览(116)

我发现这很难研究,因为我不知道这个过程叫什么。顺便说一句,我是在业余时间学习的,没有受过计算机科学的训练,尽管我过去用另一种语言java创建过带有事件处理程序的小型多线程OO应用程序。

编辑-我已经用两个示例模块替换了示例代码,见下文。
上下文

我有一个tkinter应用程序,其中主模块创建自己的窗口,然后从GUI用户可以创建额外的辅助窗口,其中包含影响主模块操作的控件。到目前为止一切顺利,我已经在一个大的python文件中工作了,在同一个模块中创建了几个辅助窗口。**动机:**为了便于管理,我想将其拆分为单独文件中的模块。

问题(我想)

当tkinter应用程序被组织成模块 * 时,辅助模块中的代码不再具有主模块中的代码 * 的可见性,或者在那里创建的对象,例如主应用程序tkinter窗口。

具体目标

举个例子,我如何安排当在辅助窗口中按下一个按钮时,它可以对主模块/中的代码产生影响(甚至是隐藏在该模块中的主窗口类中的代码)。在Python中,什么是正确的语言来描述它?

编辑:

在下面的示例中,按钮按下的结果保持在second_module内。我希望它作为一个事件传播,这样主模块或其窗口类中的任何代码都可以知道它,因此使用了伪方法“well_anything_really()”。
再说一次,虽然一个特定的解决方案是受欢迎的,但从长远来看,我想要的是理解对象(包括tkinter对象)之间这种关系的术语,以便我可以自己查找。* 对我来说,将代码分解成模块是有意义的,尽管我在网上没有看到任何关于如何做到这一点的信息,这似乎很奇怪,因为它看起来很基本,所以我假设我只是没有寻找正确的短语。*
main_module.py:

import tkinter as tk
import second_module

class Application(tk.Frame):                  
    def __init__(self, master=None):
        super().__init__(master)
        master.title("Main window")
        
        second_module.create_secondary_window(tk.Tk())
    
    def well_anything_really(self):
        # I want to make any code here benefit from awareness 
        # of the button press in the secondary window
        print("something dependent on that button press")

root = tk.Tk()
root.geometry("500x200")    
app = Application(master=root) 
app.mainloop()

第二个模块。py:

import tkinter as tk

def create_secondary_window(win0):
    win0.title("Secondary window")
        
    button1 = tk.Button(win0,text="Test_button", command=button_response) 
    button1.grid(column=0,row=0)

        
def button_response():        
    print("\nButton response: just a placeholder for any event in the secondary window")
e4yzc0pl

e4yzc0pl1#

您可以将函数well_anything_really作为参数传递给create_secondary_window(),并将此函数用作在create_secondary_window()中创建的按钮的command选项的值:

class Application(tk.Frame):
    def __init__(self, master=None):
        ...
        second_module.create_secondary_window(self, self.well_anything_really)
    ...
second_module。派
import tkinter as tk

def create_secondary_window(parent, callback):
    win0 = tk.Toplevel(parent)
    win0.title("Secondary window")

    button1 = tk.Button(win0, text="Test_button", command=callback)
    button1.grid(column=0, row=0)

相关问题