2017-12-29 26 views
0

내 프로그램은 클릭 주사위를 따라야합니다. 하나, 둘, 셋, 네, 다섯, 여섯 개의 도트가있는 6 개의 주사위 이미지를 사용해야합니다. 처음에는 1 도트로 이미지를 보여 주며 이미지를 클릭 한 후 8 회 무작위로 바꿔야합니다. 결국 마지막 무작위 이미지가 화면에 남아 있어야하지만 작동하지 않으며 해결할 수 없습니다. 어떤 생각을 어떻게 고칠 수 있을까요? (I 3 개 수업이 필요하지 것을 알고,하지만 난이 문제를 soluted해야 할 때 내가 거기에 계속) 감사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.x, event.y을 확인하지 않아도 확인하십시오.

create_image으로 새 이미지를 만드는 대신 cavas의 기존 요소에서 이미지를 변경합니다.

create_image()

나는 내가 모든 변수 dice1, dice2 등이 필요하지 않습니다이 요소

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