首页 > 解决方案 > 将现有 Python 类连接到 GUI 界面

问题描述

我正在尝试将现有的 Python 类连接到 Tkinter Gui 接口,因此我将能够在 gui 接口中输入现有类的变量。但由于某种原因,我的 tkinter gui 界面没有连接到我现有的 python 类。我已经为 python 函数做了 gui 接口,一切都没有问题,但是使用类有点棘手。当我将它放在 mainloop 之后或将它放在应用程序代码上方时,它只会打开 gui 窗口df = Loan(filename = filename_text.get(), settle_date=settle_date_text.get(), semipmts=semipmts_text.get(), share=share_text.get(), summary_dir=summary_dir_text.get()),然后 Python 会显示错误。我将不胜感激任何帮助。这是我的代码:

import pandas as pd
import numpy as np
import tkinter as tk
from tkinter import *
class Loan:
   def __init__(self, filename, settle_date, semipmts =4,share= 0, summary_dir=0):
   #read csv data
       self.data=pd.read_csv(filename)
       self.filename=filename
       self.data=self.data[['month','p','current_upb','current_interest_rate','dq']]
       self.settle_date= settle_date
       self.semipmts = semipmts
       self.summary_dir = summary_dir
   
   def get_data(self):
       self.data['Cal_Int'] = self.data['current_interest_rate']/12 *(self.data['month']+self.data['dq']+1)
       self.data['Prn'] = self.data['p']*self.data['current_upb']
       self.data['Int'] = self.data['Prn'] *self.data['Cal_Int']
       self.data['Semi Int'] = self.data['p'] * self.data['current_upb'] * self.data['current_interest_rate']/12 * self.semipmts
    
       self.data.to_csv(self.summary_dir+" summary.csv")
    
   def combined_final_grid(self):
      import glob
    
      path = self.summary_dir
    
      files=  glob.glob(path + "/*.csv")
      data_frame = pd.DataFrame()
      content = []
    
      for filename in files:
         df = pd.read_csv(filename, index_col=None)
         content.append(df)

  
      data_frame = pd.concat(content)
      data_frame.head()
      data_frame.to_excel(self.summary_dir + "summary.xlsx" , index=False)

app=Tk()

filename_text = StringVar()
filename_label = Label(app, text='File Path "/"', font=('bold', 12), pady=20)
filename_label.grid(row=0, column=0, sticky=W)
filename_entry = Entry(app, textvariable= filename_text)
filename_entry.grid(row=1, column=0)
settle_date_text = StringVar()
settle_date_label = Label(app, text='Settle Date in "Y-m-d"', font=('bold', 12), pady=20)
settle_date_label.grid(row=0, column=1, sticky=W)
settle_date_entry = Entry(app, textvariable = settle_date_text)
settle_date_entry.grid(row=1, column=1)
semipmts_text = DoubleVar()
semipmts_label = Label(app, text='   Pmts Frequency "/"', font=('bold', 12))
semipmts_label.grid(row=0, column=2, sticky=W)
semipmts_entry = Entry(app, textvariable= semipmts_text)
semipmts_entry.grid(row=1, column=2)
share_text = DoubleVar()
share_label = Label(app, text='Sharing', font=('bold', 12), pady=20)
share_label.grid(row=2, column=0, sticky=W)
share_entry = Entry(app, textvariable = share_text)
share_entry.grid(row=3, column=0)
summary_dir_text = StringVar()
summary_dir_label = Label(app, text='Summary Path', font=('bold', 12), pady=20)
summary_dir_label.grid(row=2, column=1, sticky=W)
summary_dir_entry = Entry(app, textvariable = summary_dir_text )
summary_dir_entry.grid(row=3, column=1)

summary_button =Button(app, text='Get Summary', width=15, command = df.get_data())
summary_button.grid(row=15, column=1, pady=20)


app.title('Loan Level')
app.geometry('500x500')

app.mainloop()

df = Loan(filename = filename_text.get(), settle_date=settle_date_text.get(), 
  semipmts=semipmts_text.get(), share=share_text.get(), summary_dir=summary_dir_text.get())

标签: pythontkinter

解决方案


如果您在此之前放置df = Loan()mainloop(),它甚至会在您看到窗口之前运行它,因为mainloop()它会创建窗口并运行窗口中的所有函数 - 所以您将从小部件中获得空字符串filename_text, settle_date_text, semipmts_text, share_text, summary_dir_text

如果您在之后运行它,mainloop()那么它会在您关闭窗口后运行,并且某些元素可以destroy()从内存中删除。并且df不会存在所以你可以运行command=df.get_data(顺便说一句:它必须没有()

您必须在按钮执行的功能中运行

def get_summary():
    df = Loan(filename=filename_text.get(), settle_date=settle_date_text.get(), semipmts=semipmts_text.get(), share=share_text.get(), summary_dir=summary_dir_text.get())
    df.get_data()

# ...code ...

summary_button = Button(app, text='Get Summary', width=15, command=get_summary)   # function's name without `()`

推荐阅读