2017-07-10 37 views
-1

Dies ist ein wenig das gesamte Programm, das ich baue, aber es ist sowieso nur das Frontend. Wenn Sie die App selbst machen wollen, gehen Sie voran. : So, wie der Titel sagt, ich versuche, ein Gitter zu machen, das einen Rahmen enthält, der ein Gitter enthält, und ich habe mir ein paar ähnliche Fragen angeschaut und bekomme nicht vollständig die Antworten, wahrscheinlich weil Ich bin neu in Guis und Tkinter und die Lösungen sind oft für ihr spezifisches Programm geeignet. Also hier ist ein ähnliches Problem für mich.Tkinter: Gitter mit Rahmen mit Gitternetz

Was ich versuche zu tun, ist etwas mit der gesamten Rahmenstruktur, die wie folgt aussieht: GUI Frame structure, wo jeder Rahmen neben dem ioFrame ist ein 2x2 Gitter. Der ioFrame enthält zwei Dinge: eine Eingabezeile und eine Ausgabezeile. Kurz gesagt, dies ist ein Rechner, der Logikeingaben berechnet und Ihre einzigen "Zahlen" sind wahr und falsch.

Hier ist mein Code atm:

from tkinter import *; 


class calculator: 

    #def update(self, 

    def __init__(self, window): 
     """ 
     Constructor method. 
     """ 

     self.toCompute = []; self.In = StringVar(); self.Out = StringVar(); 

     # Window title 
     window.title("Logic Calculator"); 

     # The set of 5 frames. 
     ioFrame = Frame(window, relief=GROOVE, borderwidth=3); ioFrame.grid(row=0); ioFrame.pack(); 
     nwFrame = Frame(window); nwFrame.grid(row=1,column=0); nwFrame.pack(); 
     neFrame = Frame(window); neFrame.grid(row=1,column=1); neFrame.pack(); 
     swFrame = Frame(window); swFrame.grid(row=2,column=0); swFrame.pack(); 
     seFrame = Frame(window); seFrame.grid(row=2,column=1); seFrame.pack(); 

     # Top 2 rows: the IO portion 
     Label(ioFrame, textvariable=self.In, relief=SUNKEN).grid(row=0, sticky=W); 
     Label(ioFrame, textvariable=self.Out).grid(row=1, sticky=E); 

     # Top left 2x2 Frame: [ (|) ][ T | F ] 
     brlButton = Button(nwFrame, text='(', height=2, width=10).grid(row=0,column=0); 
     brrButton = Button(nwFrame, text=')', height=2, width=10).grid(row=0,column=1); 
     truButton = Button(nwFrame, text='T', height=2, width=10).grid(row=1,column=0); 
     falButton = Button(nwFrame, text='F', height=2, width=10).grid(row=1,column=1); 

     # Top right 2x2 Frame: [ AND | OOR ][ NND | NOR ] 
     andButton = Button(neFrame, text='and', height=2, width=10).grid(row=0,column=0); 
     oorButton = Button(neFrame, text='oor', height=2, width=10).grid(row=0,column=1); 
     nndButton = Button(neFrame, text='nnd', height=2, width=10).grid(row=1,column=0); 
     norButton = Button(neFrame, text='nor', height=2, width=10).grid(row=1,column=1); 

     # Bottom left 2x2 Frame: [ SSO | IIF ][ NSO | NIF ] 
     andButton = Button(swFrame, text='sso', height=2, width=10).grid(row=0,column=0); 
     oorButton = Button(swFrame, text='iif', height=2, width=10).grid(row=0,column=1); 
     nndButton = Button(swFrame, text='nso', height=2, width=10).grid(row=1,column=0); 
     norButton = Button(swFrame, text='nif', height=2, width=10).grid(row=1,column=1); 

     # Bottom right 2x2 Frame:[ EEQ | NEG ][ NEQ | === ] 
     eeqButton = Button(seFrame, text='eeq', height=2, width=10).grid(row=0,column=0); 
     negButton = Button(seFrame, text='neg', height=2, width=10).grid(row=0,column=1); 
     neqButton = Button(seFrame, text='neq', height=2, width=10).grid(row=1,column=0); 
     comButton = Button(seFrame, text='=', height=2, width=10).grid(row=1,column=1); 



if __name__ == "__main__": # Only runs program if this specfic file is opened. 

    window = Tk(); # The window 
    calculator(window); 
    window.mainloop(); 

ich immer noch die Befehle an diese hinzufügen müssen (was ich bereits in einer separaten Datei geschrieben habe), aber ich habe nur versucht, separat die gui zu erledigen für jetzt.

Mein Problem ist, dass mein Code dieses Ergebnis stattdessen ausgibt: Current GUI. Das ist eindeutig weit weg von dem, was ich wollte. Und da ich neu hier bin, habe ich wahrscheinlich eine Liste von Problemen.

Jede Hilfe wäre willkommen.

+0

Welche Version von Python verwenden Sie? Ich benutze Python3 und der Code zur Verfügung gestellt nicht einmal – Nelson

+0

@Nelson Wie finden Sie heraus? Weißt du, was oder wo der Fehler ist? –

+0

@Nelson Version 3.3.2. –

Antwort

0

Ich gehe hier davon aus, dass Sie wegen einer Semikolon aus einer anderen Sprache zu Python gekommen sind. In Python, BENÖTIGEN SIE NICHT SEMICOLONS. Ich verstehe an der Spitze, wenn Sie wirklich diese Variablen alle auf einer Zeile halten möchten, aber jede Zeile in Ihrem Skript sollte nicht in einem Semikolon enden.

Zweitens, wenn Sie den Wert einer Schaltfläche, die Sie in eine Variable eingegeben haben, ausdrucken, sehen Sie, dass es None anstelle eines tkinter.Button Objekts ist. Dies ist wegen dieser .grid(...) Anruf am Ende der Zeile (grid gibt None zurück). Normalerweise setze ich Widgets nur dann in eine Variable, wenn ich beabsichtige, sie später in der App zu verwenden. Wenn nicht, mache ich was du mit den Labels gemacht hast, nenne sie einfach ohne some_variable_name = davor. Wenn Sie später versuchen, etwas mit diesen Schaltflächenvariablen zu tun, wird es nicht funktionieren, da sie alle None sind.

Wie in den Kommentaren erwähnt, ich war nicht in der Lage Ihren bereitgestellten Code zu bekommen zu laufen, weil Sie verwenden .grid(...)und.pack(...) die Frames auf dem Fenster zu platzieren. Du brauchst nur einen. Das hat tatsächlich die Fehler verursacht. Stellen Sie sich das Fenster oder den Rahmen als einen Container vor; Wenn Sie grid verwenden, um etwas in diesen Container zu legen, können Sie pack nicht verwenden, um etwas anderes in den Container zu legen. Die verschiedenen Methoden zum Platzieren von Widgets stehen in Konflikt zueinander. Ich glaube, die Ausgabe, die Sie erhielten, war, weil es die Rahmen unter Verwendung grid setzen würde, dann setzen Sie sie unter Verwendung pack um, weshalb sie vertikal ausgerichtet werden.


So all dies in Betracht gezogen wird, ist es das, was ich habe:

########## Frames ########## 

# this is what the frames should look like in your code 
frame = Frame(window, ...) 
frame.grid(row=, column=) 



########## Buttons ########## 

# if you want to keep the buttons in variables 
btn = Button(parent, text='', width=, height=) 
btn.grid(row=, column=) 

# or 

# if the buttons don't have to be in variables, like your Labels 
Button(parent, text='', width=, height=).grid(row=, column=) 

Es gibt auch einen Tippfehler mit Ihrer Schaltfläche Variablen.Im Bottom left 2x2 Frame Abschnitt sollten die Schaltfläche Variablen Namen der Überschrift übereinstimmen geändert werden (wenn Sie die Variablennamen halten):

ssoButton = ... 
iifButton = ... 
nsoButton = ... 
nifButton = ... 

Die Schaltfläche Variablen sind nur Verweise auf die Button-Objekte, so ein Name Wiederverwendung doesn Es ist egal, es sei denn, Sie möchten die Tasten später in Ihrem Code verwenden. In diesem Fall wird es Probleme geben, wie ich schon sagte.

ich Teil des Codes aktualisiert, so können Sie sehen, wie es aussehen sollte:

Fixed code

EDIT: ich über die ioFrame fast vergessen. Es sollte erlaubt sein, zu erweitern, um den oben zur Verfügung gestellten Platz zu füllen, aber es ist nicht. Um dies zu beheben:

ioFrame = Frame(window, relief=GROOVE, borderwidth=3, bg='green') 
ioFrame.grid(row=0, columnspan=2, sticky=N+E+S+W) 

habe ich den Hintergrund auf grün, nur um sicherzustellen, dass es den Raum gefüllt, und stellen Sie die StringVars zu einem gewissen Blindtext zum Testen (wie dies getan: self.In.set('text here') um den Text zu ändern). Nachdem alle Änderungen vorgenommen wurden, das ist meine Ausgabe:

enter image description here

+0

Danke! Was die Semikola angeht, Ik brauche ich nicht. Ich wollte nur mit dem Code aus anderen Sprachen konsistent sein. Python war das erste, was ich gelernt habe. –

+0

@OsamaKawish Gern geschehen. Das ist eigentlich ziemlich lustig. Ich wollte nur wissen, dass du es weißt :) – Nelson