尝试从python中的小部件按钮打开对话框时出错

时间:2012-07-29 05:35:56

标签: python popup widget tkinter dialog

我是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()

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

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

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'

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

2 个答案:

答案 0 :(得分:1)

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

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

top = self.top = Tkinter.Toplevel(self.mymaster)

答案 1 :(得分:0)

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