2016-07-03 11 views
0

を再起動して、これは私のコードの簡単な例です:PythonのTkinterには、プログラムに

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

私はすべてのフレームとラベルを削除し、プログラムを再起動します。しかし、正しく動作しません。私が最初にボタンagainを使用すると、それは動作します。しかし、もう一度ボタンをクリックすると、フレームは破壊されません。

EDIT: これは私のコードのサンプルです:

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) 

私はブラックジャックのゲームを作成したいと思います。 class BlackJackは、プレイヤーとディーラーのために新しいカードを選び、これらのカードの価値を比較し、誰が勝者であるかを判断します。 class BjGuiにはプレイヤーとディーラーのカードが表示され、ボタンとフレームのボタンがいくつかあります。ゲームが終了すると、私は関数check_limitを使用して勝者であることを決定し、関数show_resultは結果と新しいボタンで新しいラベルを作成します。このボタンはゲームを再開できるはずです。

答えて

1

私はあなたが持っているオブジェクトの再帰を望んでいないと思います。 新しいABは、作業中の現在のAの内側にあります。つまり、スタックの上部です。 helloおよびworldは、スタックの最下部のみを参照し、オブジェクト再帰スタック内の他のすべてのAおよびBを参照しません。

また、2つの異なるクラスまたは2つの異なるフレームが必要な理由はわかりません。さまざまなフレームやクラスでどのようにしたらよいかを提案したいと思います。

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サンプルの最後の2行を表示しますか?既存のオブジェクト内に新しいオブジェクトを作成しています。これは、既存のオブジェクトを置き換えません。既存のオブジェクトはリセットされません。新しいオブジェクトを作成しないでください。既存のオブジェクトの状態を好みの状態に変更するだけです。 – beauxq

関連する問題