python - 将现有 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())
解决方案
如果您在此之前放置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 `()`
推荐阅读
- flutter - Flutter - 如何创建来电通知?
- java - 找到离给定点最近的折线
- php - cURL 不发送 postfields
- c# - 有没有办法使用接口来实现类似的结果?
- java - 使用历史 ID 从 gmail 获取 nextMessages 时出现 failedPrecondition 错误 - Google API
- django - 如何将字段的 django 序列化程序验证错误作为 json fromat 进行反应
- css - 如何以角度更改简单条颜色
- c# - 增加具有指定字符模式的唯一字段
- c++ - Qt。大量不可控计算期间的非阻塞进度对话框
- reactjs - 在不同条件下使用两个不同的处理程序处理按钮单击 - ReactJS