2017-02-11 5 views
0

schreiben Sie eine GUI in Tkinter mit Python 2.11 mit einem OOP-Ansatz und versuchen, Vererbung zu lernen. In der GUI unten habe ich zwei Eingabe-Widgets. Das erste Widget mit der Bezeichnung "Enter Value - Does Not Return" verwendet die Klasse EntryField, die von der Tkinter Entry Class erbt. Wenn Sie einen Wert in dieses Eingabefeld eingeben, wird die Methode setDesVol aufgerufen, aber der Wert in self.desV wird nicht zurückgegeben. Wenn ich versuche, die andere Anweisung self.desV = self.parent.get() (die auskommentiert ist) gibt einen Fehler, der besagt MainWindow-Instanz hat kein Attribut erhalten.Probleme mit dem Erben von Eintrag Box Widget mit Tkinter

Jetzt, wenn ich das nächste Eintrag Widget das Objekt entValue zugeordnet aufrufen, funktioniert dies völlig in Ordnung, da es in der MainWindow-Klasse enthalten ist und die Methode setValue und self.entValue.get() funktioniert wie vorgesehen.

Hat jemand irgendwelche Ideen, was ich falsch mache in der EntryField-Klasse, um den Wert aus dem Eingabefeld zu bekommen. Mein Plan ist es, mehr Eingabefelder in der endgültigen GUI zu haben und möchte, dass jedes Eingabefeld seine eigene assoziierte Methode wie setDesVol hat, um den Code sauberer und leichter zu verwalten. Ich habe ungefähr 3 Tage damit verbracht, herauszufinden, dass jede Hilfe geschätzt wird. Der Code ist unten angehängt. Dank

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

Antwort

1

In der EntryField Klasse, in der setDesVol Methode verwenden Sie:

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

So haben Sie eine neue EntryField Instanz erstellen und seine get Methode aufrufen, die '' zurückkehren, da Einträge standardmäßig leer sind. Um den Inhalt des aktuellen EntryField zu erhalten, rufen Sie einfach die Methode get es von `tk.Entry geerbt:

`self.desV = self.get()` 

Sie haben ein ähnliches Problem in der MainWindow Klasse, wenn Sie die Bindungen zu tun:

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

Die zweite Zeile erstellt eine EntryField und bindet ihre setDesVol Methode an die Return-Taste in self.entDesVolt drückt. Da diese neue EntryField leer ist, druckt jeder Return-Taste drücken "Self des V ist:". Um dies zu korrigieren, binden Sie einfach die setDesVol-Methode von self.entDesVolt an die Eingabetaste zurück:

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