2016-04-25 7 views
1

Ich bin neu in der GUI-Programmierung und ich versuche, dieses Python-Programm zu arbeiten. Was wäre der richtige Weg, um die Funktion start() aufzurufen, damit die beiden Leinwände aktualisiert werden. Mein Code sieht so aus.Tkinter Loop-Funktion

from Tkinter import * 
class TKinter_test(Frame): 
    def __init__(self,parent): 
     Frame.__init__(self,parent) 
     self.parent = parent 
     self.initUI() 

    user_reply = 0 


    def accept(self): 
     self.user_reply = 1 
    def decline(self): 
     self.user_reply = 2 

    def initUI(self): 
     BtnFrame = Frame (self.parent) 
     BtnFrame.place(y=450, x=20) 

     canvasFrame = Frame(self.parent) 
     canvasFrame.place(y = 200) 
     canvas_1 = Canvas(canvasFrame, width = "220", height ="200") 
     canvas_2 = Canvas(canvasFrame, width = "220", height ="200") 
     canvas_1.pack(side = LEFT) 
     canvas_2.pack(side = RIGHT) 

     textfield_1 = canvas_1.create_text(30,50,anchor = 'w', font =("Helvetica", 17)) 
     textfield_2 = canvas_2.create_text(30,50,anchor = 'w', font =("Helvetica", 17)) 
     Accept = Button(BtnFrame, text="Friends!", width=25, command = self.accept) 
     Decline = Button(BtnFrame, text="Not friends...", width=25, command = self.decline) 
     Accept.pack(side = LEFT) 
     Decline.pack(side = RIGHT) 

    def ask_user(self,friend_1,friend_2): 
     timer = 0; 

     while(timer == 0): 
      if(self.user_reply == 1): 
       print friend_1 + " and " + friend_2 + " are friends!" 
       self.user_reply = 0 
       timer = 1; 
      elif(user_reply == 2): 
       print friend_1 + " and " + friend_2 + " are not friends..." 
       self.user_reply = 0 
       timer = 1 

    def start(self): 
     listOfPeople = ["John","Tiffany","Leo","Tomas","Stacy","Robin","Carl"] 
     listOfPeople_2 = ["George","Jasmin","Rosa","Connor","Valerie","James","Bob"] 
     for friend_1 in listOfPeople: 
      for friend_2 in listOfPeople_2: 
       ask_user(friend_1,friend_2) 
     print "Finished" 

def main(): 
    root = Tk() 
    root.geometry("500x550") 
    root.wm_title("Tkinter test") 
    app = TKinter_test(root) 
    root.mainloop() 

if __name__ == '__main__': 
main() 

Ich möchte in ask_user etwas verwenden, die textfield_1 und 2. So etwas wie textfield_1.itemconfigure(text = friend_1) aktualisiert, und ich würde es vorziehen, nicht Threads zu verwenden. Danke.

+0

Es ist unklar, wie Sie das Update durchführen möchten. –

+0

Nun, jedes Mal, wenn die Funktion 'start()' die Funktion 'ask_user()' aufruft, möchte ich, dass sie die Ansicht mit den zwei Namen der Freundesliste aktualisiert und darauf wartet, dass der Benutzer eine Antwort gibt, ob sie das tut oder nicht sind Freunde mit Schaltflächen Akzeptieren/Ablehnen @BillalBEGUERADJ – Nate

+0

Sorry für die späte Antwort, aber hoffentlich wird mein Code hilfreich sein. –

Antwort

0

Es braucht eine andere Denkweise, um ereignisgesteuerte Programmierung zu machen, und es kann zunächst ein wenig frustrierend und verwirrend sein. Ich schlage vor, dass Sie sich den Code in den hochklassigen Tkinter-Antworten auf Stack Overflow ansehen und damit experimentieren, kleine Änderungen vornehmen und sehen, was passiert. Wenn Sie damit vertrauter werden, wird anfangen, Sinn zu ergeben. :)

Ich weiß nicht, warum Sie diese alle Frame und Canvas Objekte wollen, so habe ich die GUI vereinfacht eine einzelne Frame zu verwenden, „borgen“ Bryan Oakley Vorlage aus this answer. Anstatt Canvas Textelemente zu verwenden, um die Freundesnamen anzuzeigen, verwende ich einfach einfache Label Widgets.

Anstatt die Freundeslisten in die GUI-Klasse zu codieren, gebe ich sie in einem Tupel an den GUI-Konstruktor als Schlüsselwortargument, friendlists. Wir müssen dieses Argument von kwargs entfernen, bevor kwargs an die Methode Frame.__init__ übergeben wird, da diese Methode Schlüsselwortargumente behandelt, die nicht als Fehler erkannt werden.

Ich erstelle einen Generator Ausdruck self.pairs, die eine doppelte for Schleife verwendet, um die Paare von Freunden Namen zu ergeben. Wenn wir next(self.pairs) anrufen, erhalten wir das nächste Paar von Freundennamen.

Wenn ein Button die test_friends Methode gedrückt wird, mit einem reply arg von True oder False, je nachdem, ob die als „Freunde!“ oder "Nicht Freunde." Taste gedrückt.

test_friends druckt die Informationen über das aktuelle Freundespaar und ruft dann die Methode set_friends auf, um die Namen des nächsten Freundespaars in Labels festzulegen. Sind keine Paare mehr vorhanden, wird das Programm beendet.

import Tkinter as tk 

class MainApplication(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     # Extract the friend lists from the keyword args 
     friends1, friends2 = kwargs['friendlists'] 
     del kwargs['friendlists'] 

     tk.Frame.__init__(self, parent, *args, **kwargs) 
     self.parent = parent 

     # A generator that yields all pairs of people from the friends lists 
     self.pairs = ((u, v) for u in friends1 for v in friends2) 

     # A pair of labels to display the names 
     self.friend1 = tk.StringVar() 
     tk.Label(self, textvariable=self.friend1).grid(row=0, column=0) 

     self.friend2 = tk.StringVar() 
     tk.Label(self, textvariable=self.friend2).grid(row=0, column=1) 

     # Set the first pair of names 
     self.set_friends() 

     cmd = lambda: self.test_friends(True) 
     b = tk.Button(self, text="Friends!", width=25, command=cmd) 
     b.grid(row=1, column=0) 

     cmd = lambda: self.test_friends(False) 
     b = tk.Button(self, text="Not friends.", width=25, command=cmd) 
     b.grid(row=1, column=1) 

    def set_friends(self): 
     # Set the next pair of names 
     f1, f2 = next(self.pairs) 
     self.friend1.set(f1) 
     self.friend2.set(f2) 

    def test_friends(self, reply): 
     f1, f2 = self.friend1.get(), self.friend2.get() 
     reply = (' not ', ' ')[reply] 
     print '%s and %s are%sfriends' % (f1, f2, reply) 
     try: 
      self.set_friends() 
     except StopIteration: 
      # No more pairs 
      print 'Finished!' 
      self.parent.destroy() 


def main(): 
    people_1 = [ 
     "John", 
     "Tiffany", 
     "Leo", 
     "Tomas", 
     #"Stacy", 
     #"Robin", 
     #"Carl", 
    ] 

    people_2 = [ 
     "George", 
     "Jasmin", 
     "Rosa", 
     #"Connor", 
     #"Valerie", 
     #"James", 
     #"Bob", 
    ] 

    root = tk.Tk() 
    root.wm_title("Friend Info") 
    app = MainApplication(root, friendlists=(people_1, people_2)) 
    app.pack() 
    root.mainloop() 

if __name__ == "__main__": 
    main() 
+0

Danke! Ich bin sicher, dass ich mein Programm damit arbeiten lassen kann. – Nate