2017-12-29 73 views
0

私のプログラムはクリックロールダイスでなければなりません - 1,2,3,4,5,6ドットの6つのサイコロ画像を使用します。最初に1ドットで画像を表示し、画像をクリックしてからランダムに8回変えるべきです。最終的に、最後のランダムな画像は画面上にとどまるべきですが、うまくいかず、解決できません。どのようにそれを修正するための任意のアイデアですか? (私は3つのクラスが、このために必要ではないことを知っているが、私はこの問題を固溶しているだろうとき、私はそれに続けます) おかげPython - クリック時のイベントを伴うtkinterのオブジェクト指向の機能

import tkinter, random 

class Main: 
    def __init__(self, area, dice): 
     dice.throw(area) 

class Area: 

    def __init__(self): 
     self.canvas = tkinter.Canvas(width=1000, height=600) 
     self.canvas.pack() 
     self.dice1 = tkinter.PhotoImage(file='numberOne.png') 
     self.canvas.create_image(680,540,image=self.dice1) 
     self.canvas.bind('<Button-1>', Dice.throw) 

class Dice: 

    def throw(event): 
     if event.x < 730 and event.x > 630 and event.y < 590 and event.y > 490: 
      dice1 = tkinter.PhotoImage(file='numberOne.png') 
      dice2 = tkinter.PhotoImage(file='numberTwo.png') 
      dice3 = tkinter.PhotoImage(file='numberThree.png') 
      dice4 = tkinter.PhotoImage(file='numberFour.png') 
      dice5 = tkinter.PhotoImage(file='numberFive.png') 
      dice6 = tkinter.PhotoImage(file='numberSix.png') 
      for i in range(8): 
       number = random.randrange(6) + 1 
       if number == 1: 
        area.canvas.create_image(680,540,image=dice1) 
       elif number == 2: 
        area.canvas.create_image(680,540,image=dice2) 
       elif number == 3: 
        area.canvas.create_image(680,540,image=dice3)    
       elif number == 4: 
        area.canvas.create_image(680,540,image=dice4)  
       elif number == 5: 
        area.canvas.create_image(680,540,image=dice5) 
       elif number == 6: 
        area.canvas.create_image(680,540,image=dice6) 
       area.canvas.after(100) 
       area.canvas.update() 

pl = Area() 
dice = Dice() 
main = Main(pl, dice) 
+0

あなたのコードが動作しません正確にどのようにしてください。エラーがあれば貼り付けます。 – Nae

+0

クリックイベントをどのようにランダムに表示するのか分かりません – Jozko

+0

あなたはクラスインスタンスで 'bind( ''、dice.throw)'と一緒に使う必要があります。 'ダイス'を作る – furas

答えて

0

問題がAreaインスタンス(plが)Diveインスタンスへのアクセスを必要とするということです(dive)、DiveインスタンスはAreaインスタンスにアクセスする必要があります。そのDive

dice = Dice(root) 
area = Area(root, dice) # `Area` gets access to `Dive` instace 
dice.area = area  # `Dive` gets access to `Area` instace 

dive.throw使用でき、Divearea.canvas又は他の要素を使用することができます。それは単純な私はキャンバス上の画像にタグを割り当ててから、私は<Button-1>を割り当てるためにtag_bindを使用することができますし、私はevent.xevent.yをチェックする必要はありませんようにするに

create_imageで新しい画像を作成する代わりに、私はcavasの既存の要素の画像を変更します。

create_image()

は、私はので、私はすべての変数 dice1dice2などを必要としないこの要素

self.canvas.itemconfig(self.image_id, image=image) 

私は、リスト上のすべてのイメージを保つに画像を変更することができますので、後の要素IDに

self.image_id = self.canvas.create_image(...) 

を与えますと私はif/elifの代わりにインデックスを使用して画像を取得することができます。私はrandom.choice(self.images)を使ってリストからランダムな要素を取得することもできます。

image = random.choice(self.images) 

全コード:

import tkinter 
import random 

class Main: 

    def __init__(self, area, dice): 
     dice.throw(area) 

class Area: 

    def __init__(self, master, dice): 
     self.master = master 

     self.canvas = tkinter.Canvas(master, width=1000, height=600) 
     self.canvas.pack() 

     self.image = tkinter.PhotoImage(file='numberOne.png') 
     self.image_id = self.canvas.create_image(680, 540, image=self.image, tags='tag_image') 

     self.canvas.tag_bind('tag_image', '<Button-1>', dice.throw) 

    def change_image(self, image): 
     print('changing image') 
     self.canvas.itemconfig(self.image_id, image=image) 

class Dice: 

    def __init__(self, master): 
     self.master = master 
     self.area = None # assign later 

     self.images = [   
      tkinter.PhotoImage(file='numberOne.png') 
      tkinter.PhotoImage(file='numberTwo.png') 
      tkinter.PhotoImage(file='numberThree.png') 
      tkinter.PhotoImage(file='numberFour.png') 
      tkinter.PhotoImage(file='numberFive.png') 
      tkinter.PhotoImage(file='numberSix.png') 
     ] 

    def throw(self, event): 
     if self.area: 
      for i in range(8): 
       image = random.choice(self.images) 

       self.area.change_image(image) 

       self.master.update() 
       self.master.after(100) 

# --- main --- 

root = tkinter.Tk() 

dice = Dice(root) 
area = Area(root, dice) 
dice.area = area 

root.mainloop() 
関連する問題