首页 > 解决方案 > 如何将按钮的命令函数的返回值作为另一个按钮的命令函数的输入传递

问题描述

我是 tkinter 的新手,请帮帮我。我已经实现了一个模块(PDF2Text.Py),它的类有一个函数(convert_pdf_to_txt(path)),它采用pdf文件的路径并将pdf文件转换为文本。

我还实现了另一个模块(TopicModeling.py),它的类有一个函数(creat_LDA_model(text)),它接受文本并对文本进行主题建模。

现在,我想要 tkinter GUI,即,单击“浏览”按钮后,它会使用 filedialog.askopenfilename 浏览路径,并且它的命令函数将给定的路径发送到 PDF2Text.Py 的 convert_pdf_to_txt(path) 函数。

然后通过单击“模型”按钮,其命令函数获取文本并将其发送到 TopicModeling.py 中的 creat_LDA_model(text) 函数,并在 Entry 小部件或任何其他小部件类型中显示结果。

我想知道GUI模块的结构;如何在按钮的命令功能中从 GUI 模块调用或获取和设置其他模块/功能的参数。

让我再解释一下:

假设这是我的代码:

import tkinter
from tkinter import filedialog
import TopicModeling
import Pdf2Text

window = tkinter.Tk()
window.title("Welcome to test tkinter app")
window.geometry('750x600')# Setting Window Size

lbl = tkinter.Label(window, text="Select a pdf file:", font=("Arial Bold", 15))#Set Label Font Size
lbl.grid(column=0, row=0)#set its position on the form



def Return_pdfText():
          filename =  filedialog.askopenfilename(filetypes = (("pdf files","*.pdf"),("all files","*.*")))    
         mytext = Pdf2Text.Pdf2Text(filename)   
         PdfText=mytext.convert_pdf_to_txt(filename)
         return PdfText

Button=tkinter.Button(window,text="Browse",command=Return_pdfText)
Button.grid(column=0, row=1)

window.mainloop()

我想放另一个按钮,即“模型”。它的命令函数应该获取 pdfText 作为输入并对其建模,如下所示:

Button=tkinter.Button(window,text="Model",command=Model)
Button.grid(column=1, row=1)

def Model(pdfText): #??
    my_LDA_model= TopicModeling.TopicModeling(PdfText)
   model=my_LDA_model.create_lda_model()
   my_LDA_model.WordCloud_topics(model)
   ...????

结果(主题和图表)应在某些小部件的 GUI 中显示。

我的问题是关于这个命令功能。如何将 pdfText 传递给模型函数,如何显示结果以及在哪种类型的小部件中?

谢谢

标签: pythonuser-interfacetkinter

解决方案


当你有一个小程序时,最简单的方法是使用全局变量来共享数据:

def Return_pdfText():
    global PdfText  # Put the variable in the global scope
    filename =  filedialog.askopenfilename(filetypes = (("pdf files","*.pdf"),("all files","*.*")))    
    mytext = Pdf2Text.Pdf2Text(filename)   
    PdfText = mytext.convert_pdf_to_txt(filename)   # Assign to global variable

分配一个值后PdfText,它将可用于该Model()函数,您无需传递它:

def Model():
    my_LDA_model = TopicModeling.TopicModeling(PdfText)
    model = my_LDA_model.create_lda_model()
    my_LDA_model.WordCloud_topics(model)

推荐阅读