使用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()
答案 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)