0

我是 python 新手。我正在尝试打开一个对话框以从一个小部件中获取一个值,该小部件已经完成了其他员工的列表。

但是遇到错误,无法弄清楚该怎么做。

这是我的代码:

import Tkinter,Tkconstants,tkFileDialog
from Tkinter import *
import csv
import numpy
import math
import numpy.random as nrnd
import matplotlib.pyplot as plt
import shutil
import tkMessageBox
global filesavepath
class App:
    def __init__(self,master):
        self.mymaster=master
        frame=Frame(master)
        frame.pack()
        self.importbutton=Button(frame,text='Import Data',command=self.importdata)
        self.importbutton.pack()
        self.executebutton=Button(frame,text='Execute',command=self.popup)
        self.executebutton.pack()
        self.distribution_rep=Button(frame,text='Repeat Purchase Score Distribution',command=self.distrepbutton)
        self.distribution_rep.pack()
        self.distribution_churn=Button(frame,text='Churn Probability Distribution',command=self.distchurnbutton)
       self.distribution_churn.pack()
       self.exitbutton=Button(frame,text='Exit',command=self.exitapp)
       self.exitbutton.pack()
       self.file_opt=options={}
       options['defaultextension']=''
       options['filetypes']=[('allfiles','.*'),('textfiles','.txt')]
       options['initialdir']='C:\\'
       options['initialfile']='myfile.txt'
       options['parent']=root
       options['title']='Thisisatitle'
    def importdata(self):
        filename=tkFileDialog.askopenfilename(**self.file_opt)
        filesavepath="C:/input_full.csv"
        shutil.copy2(filename,filesavepath)
        if filename:
            return open(filename,'r')

    def popup(self):
        top = self.top = Tkinter.Toplevel(self)
        myLabel = Tkinter.Label(top, text='Enter your username below')
        myLabel.pack()

        self.myEntryBox = Tkinter.Entry(top)
        self.myEntryBox.pack()

        mySubmitButton = Tkinter.Button(top, text='Done', command=self.execbutton)
        mySubmitButton.pack()
    def execbutton(self):
        if self.myEntryBox.get() != "":
            self.timevalue = self.myEntryBox.get()
            self.top.destroy()
        execfile("Repeat Purchase Algo in python v6")
        tkMessageBox.showinfo("Job Done", "Probability Computation completed")       
    def send(self):
        global timevalue
        timevalue=self.myEntryBox.get()
        self.top.destroy()
    def distrepbutton(self):
        plt.hist(prob,bins=10,normed=TRUE)
        plt.xlabel('Probability')
        plt.title('Histogram of Repeat Purchase Probability')
        plt.show()
    def distchurnbutton(self):
        plt.hist(churn_prob,bins=10,normed=TRUE)
        plt.ylabel('Probability')
        plt.title('Histogram of Churn Probability')
        plt.show()
    def exitapp(self):
        self.mymaster.destroy()

root=Tk()
root.title('Repeat Puchase Widget')
app=App(root)
root.mainloop()

因此,您可能很清楚,我正在使用 Import 按钮导入数据集,通过名为 Execute 的按钮在另一个代码中执行一些分析,然后显示一些图表。

我想要的是在单击“执行”按钮时打开一个弹出窗口,该窗口将输入一个值。但我收到以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:/Python27/widget_repeat_purchase_v4", line 42, in popup
    top = self.top = Tkinter.Toplevel(self)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 2017, in __init__
    BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1965, in __init__
    BaseWidget._setup(self, master, cnf)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1943, in _setup
    self.tk = master.tk
AttributeError: App instance has no attribute 'tk'

我不知道该怎么办。请帮忙。

4

2 回答 2

1

当您创建顶级小部件时,您将self作为第一个参数传递。Tkinter 要求这是一个父小部件。但是,在您的代码self中并不代表一个小部件。

在您的特定情况下,您想要传递self.mymaster而不是self

top = self.top = Tkinter.Toplevel(self.mymaster)
于 2012-07-29T12:06:24.603 回答
0

使用Tkinter.Toplevel()代替Tkinter.Toplevel(self)

于 2012-07-29T10:34:43.747 回答