使用Tkinter继承Entry Box小部件的问题

时间:2017-02-11 03:25:26

标签: python tkinter

使用Python 2.11在Tkinter中使用OOP方法编写GUI并尝试学习继承。在下面的GUI中,我有两个条目小部件。带有标签"输入值的第一个小部件 - 不返回"使用继承自Tkinter Entry Class的类EntryField。在此条目框中输入值时,将调用方法setDesVol,但不会返回self.desV中的值。如果我尝试其他语句self.desV = self.parent.get()(已注释掉)会给出一个错误,指出MainWindow实例没有属性get。

现在,当我调用分配给对象entValue的下一个条目窗口小部件时,它完全正常,因为它包含在MainWindow类中,并使用方法setValue和self.entValue.get()按预期工作。

有没有人对我在EntryField类中做错了什么有任何想法,以从输入框中获取值。我的计划是在最终的GUI中有更多的输入框,并希望每个输入框都有自己的关联方法,如setDesVol,以保持代码更清晰,更易于管理。我花了大约3天试图解决这个问题,所以任何帮助都表示赞赏。代码附在下面。感谢

import Tkinter as tk
import ttk
import tkMessageBox as mBox

class MainWindow(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent

        self.olFrame = tk.LabelFrame(text = 'Open Loop Frame', bg = 'red')
        self.olFrame.grid(column = 0, row = 0, sticky = 'w')
        self.voltLabel = tk.Label(self.olFrame,
                text = 'Enter Value - Does Not Return ',
                font = ("Times", 10), bg = 'red').grid(column = 0, row = 1)

        #entry box code that does not return anything
        self.entDesVolt = EntryField(self.olFrame,bg = 'red')
        self.entDesVolt.bind("<Return>", EntryField(self).setDesVol)
        self.entDesVolt.grid(column = 1, row = 1)

        #this entry box code works fine
        self.mezLabel = tk.Label(self.olFrame,
                text = 'Enter Another Value - works right ',
                font = ("Times", 10), bg = 'grey').grid(column = 0, row = 2)
        self.entValue = tk.Entry(self.olFrame, bg = 'grey')
        self.entValue.bind("<Return>", self.setValue)
        self.entValue.grid(column = 1, row = 2)

    def setValue(self, event):
        print self.entValue.get()
        print 10 + float(self.entValue.get())

class EntryField(tk.Entry):
    def __init__(self, parent, *args, **kwargs):
        tk.Entry.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        print "self.parent in EntryField is type:  ", type(self.parent)

    def setDesVol(self,event):
        self.desV = EntryField(self).get()  #doesnt return anything in print statement
        #self.desV = self.parent.get()  #MainWindow instance has no attribute get
        #self.desV = tk.Entry(self).get()  #doesnt return anything in print statement
        print "self des V is:  ", self.desV

root = tk.Tk()
root.geometry('500x400')
root.title('Test GUI')
root.configure(background = "black")

a = MainWindow(root)
root.mainloop()

1 个答案:

答案 0 :(得分:1)

EntryField课程中,在setDesVol方法中,您使用:

`self.desV = EntryField(self).get()` 

因此,您创建一个新的EntryField实例并调用其get方法,该方法返回'',因为条目默认为空。要获取当前EntryField的内容,只需调用它从`tk.Entry继承的get方法:

`self.desV = self.get()`

执行绑定时,MainWindow类中存在类似的问题:

self.entDesVolt = EntryField(self.olFrame, bg='red')
self.entDesVolt.bind("<Return>", EntryField(self).setDesVol)

第二行创建EntryField并将其setDesVol方法绑定到self.entDesVolt中的Return键。由于这个新的EntryField是空的,所以任何Return键按下打印&#34; self des V是:&#34;。要更正这一点,只需将setDesVol self.entDesVolt方法直接绑定到Return键按下:

self.entDesVolt = EntryField(self.olFrame, bg='red')
self.entDesVolt.bind("<Return>", self.entDesVolt.setDesVol)