【问题标题】:Conecting Existing Python class to a GUI interface将现有 Python 类连接到 GUI 界面
【发布时间】:2021-06-24 06:08:17
【问题描述】:

我正在尝试将现有的 Python 类连接到 Tkinter Gui 接口,因此我将能够在 gui 接口中输入现有类的变量。但由于某种原因,我的 tkinter gui 界面没有连接到我现有的 python 类。我已经为 python 函数做了 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()) 放在主循环之后或将其放在应用程序代码上方时,它只会打开 gui 窗口,然后 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())

【问题讨论】:

  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
  • 如果你把它放在mainloop() 之前,那么它会在你看到窗口之前运行它,因为mainloop() 创建窗口并运行窗口中的所有函数。如果您在mainloop() 之后运行它,那么它会在您关闭窗口后运行,并且某些元素可以是destroy() 并从内存中删除。我认为您的按钮应该运行运行 Loan()df.get_data() 的功能

标签: python tkinter


【解决方案1】:

如果您将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 `()`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多