2016-07-03 28 views
0

das ist einfaches Beispiel für meinen Code:Python tkinter, starten Sie das Programm

from tkinter import * 
import random 


class A: 

    def __init__(self, master): 
     n = random.randrange(1, 10, 1) 
     self.frame_a = Frame(master) 
     self.frame_a.pack() 
     self.label_a = Label(self.frame_a, text=n) 
     self.label_a.pack() 

    def clean(self): 
     self.frame_a.destroy() 
     A(root) 
     B(root) 


class B: 

    def __init__(self, master): 
     self.frame_b = Frame(master) 
     self.frame_b.pack() 
     self.button_b = Button(self.frame_b, text='again', command=self.do_again) 
     self.button_b.pack() 

    def do_again(self): 
     self.frame_b.destroy() 
     hello.clean() 


root = Tk() 
hello = A(root) 
world = B(root) 
root.mainloop() 

ich löschen möchten alle Rahmen und Beschriftung und das Programm neu starten. Aber es funktioniert nicht richtig. Wenn ich zum ersten Mal die Taste again verwende, funktioniert es. Wenn ich jedoch erneut auf die Schaltfläche klicke, wird der Rahmen nicht zerstört.

EDIT: Dies ist ein Beispiel meines Code:

class GamePick: 

    def __init__(self): 
     #there are also some labels and frames but they relate to my problem 

    def do_black_jack(self): 
     global bj 
     global bj_play 
     ''' You pick Black Jack, open new window and close actual window''' 
     bj = Toplevel(self.master) 
     bj_play = BjGui(bj) 
     bj['bg'] = 'springgreen4' 
     bj.wm_geometry("1500x900") 
     Choices.close(my) 

class BlackJack: 

    #There are some function for pick new card for player and dealer 

    def check_limit(self):# 
     if sum(player_cards_val) > 21: 
      if 11 in player_cards_val: 
        player_cards_val.remove(11) 
        player_cards_val.append(1) 
        self.check_limit() 
      else: 
        bj_play.show_result(res='Dealer win') 
     elif sum(bot_cards_val) > 21: 
      if 11 in bot_cards_val: 
        bot_cards_val.remove(11) 
        bot_cards_val.append(1) 
        self.check_sixteen() 
      else: 
        bj_play.show_result(res='Player win') 
     else: 
      if sum(player_cards_val) > sum(bot_cards_val): 
        bj_play.show_result(res='Player win') 
      else: 
        bj_play.show_result(res='Dealer win') 



class BjGui: 


    def __init__(self, master): 
     self.master = master 
     self.bot_frame = Frame(self.master, height=False, width=False, bg='springgreen4') 
     bj.wm_geometry("1500x900") 
     self.bot_frame.pack(side='top', pady=20) 
     self.player_frame = Frame(self.master, height=False, width=False, bg='springgreen4') 
     bj.wm_geometry("1500x900") 
     self.player_frame.pack(side='bottom', pady=20) 
     self.buttons_frame = Frame(self.master, bg='springgreen4') 
     self.buttons_frame.pack(side=BOTTOM) 
     # There are function for this class, they show players cards and bots cards from class Black Jack 


    def show_result(self, res):#This function, create new label and button. 
           # New label show result of the game, after I click button, it should will restart 
     self.info_label = Label(self.master, text=res, font=('aharoni', 60), bg='springgreen4', pady=35) 
     self.info_label.pack() 
     self.again_frame = Frame(self.master) 
     self.again_frame.pack() 
     self.again_bt = Button(self.again_frame, text='play again', font=('times', 12), command=self.do_again, bg='blue') 
     self.again_bt.pack() 

    def do_again(self):# This should delete all frames and clear list with cards and restart game, but it doesn't work 
     self.info_label.destroy() 
     self.again_frame.destroy() 
     self.player_frame.destroy() 
     self.bot_frame.destroy() 
     self.buttons_frame.destroy() 
     bot_cards_key.clear() 
     bot_cards_val.clear() 
     player_cards_key.clear() 
     player_cards_val.clear() 
     no_repeat.clear() 
     BlackJack() 
     BjGui(bj) 

Ich mag Black Jack-Spiel schaffen. class BlackJack wählt neue Karten für Spieler und Dealer aus, vergleicht den Wert dieser Karten und bestimmt, wer der Gewinner ist. class BjGui zeigt Spieler und Händlerkarten, dort einige Knöpfe Rahmen und Etiketten. Wenn das Spiel endet, benutze ich die Funktion check_limit, es bestimmt, wer der Gewinner ist und die Funktion show_result neues Etikett mit Ergebnis und neuer Schaltfläche erstellen. Diese Schaltfläche sollte das Spiel neu starten können.

Antwort

1

Ich glaube nicht, dass Sie die Objekt Rekursion, die Sie haben wollen. Sie machen neue A s und B s innerhalb der aktuellen A, mit denen Sie arbeiten - die Spitze des Stapels. hello und world beziehen sich nur auf den unteren Teil des Stapels, nicht auf alle anderen A s und B s in Ihrem Objekt-Rekursionsstapel.

Auch ich bin mir nicht sicher, warum Sie zwei verschiedene Klassen oder zwei verschiedene Frames wollen. Ich müsste verstehen, was Sie mit verschiedenen Frames und Klassen vorschlagen möchten.

from tkinter import * 
import random 


class A: 
    def __init__(self): 
     self.master = Tk() 

     self.frame_a = None 
     self.label_a = None # not necessary, but common styling preference 
     self.button_b = None # not necessary, but common styling preference 

     self.clean() 
     self.master.mainloop() 

    def clean(self): 
     if self.frame_a is not None: 
      self.frame_a.destroy() 
     n = random.randrange(1, 10, 1) 
     self.frame_a = Frame(self.master) 
     self.frame_a.pack() 
     self.label_a = Label(self.frame_a, text=n) 
     self.label_a.pack() 
     self.button_b = Button(self.frame_a, text='again', command=self.clean) 
     self.button_b.pack() 


hello = A() 
+0

@Marty Sehen Sie die letzten zwei Zeilen Ihrer Probe? Sie erstellen neue Objekte innerhalb des vorhandenen Objekts. Dies ersetzt nicht die vorhandenen Objekte. Die vorhandenen Objekte werden nicht zurückgesetzt. Erstellen Sie keine neuen Objekte. Ändern Sie einfach den Status der vorhandenen Objekte so, wie Sie sie haben möchten. – beauxq