2014-06-10 8 views
0
from tkinter import * 

def move(): 
    global x1, y1, dx, dy, flag, n 

    x1, y1 = x1 + dx, y1 + dy 

    if x1 > 360: 
     n = 0 
     x1, dx, dy = 360, 0, 15 

    if y1 > 360: 
     n = 1 
     y1, dx, dy = 360, -15, 0 

    if x1 < 10: 
     x1, dx, dy = 10, 0, -15 
     n = 2 

    if y1 < 10: 
     y1, dx, dy = 10, 15, 0 
     n = 3 

    can1.coords(oval1, x1, y1, x1 + 30, y1 + 30) 

    if flag > 0: 
     abl1.after(50, move) 

def stop(): 
    global flag 
    flag = 0 

def start(): 
    global flag 
    if flag == 0: 
     flag = 1 
     move() 

### 

x1, y1 = 10, 10 
dx, dy = 15, 0 
color = [["white"], ["red"], ["green"], ["blue"]] 
n = 0 

flag = 0 

### 

abl1 = Tk() 
abl1.title("Animációs gyakorlat Tkinter-rel") 

can1 = Canvas(abl1, bg = "dark grey", height = 400, width = 400) 
can1.pack(side=LEFT) 

oval1 = can1.create_oval(x1, y1, x1 + 30, y1 + 30, fill = color[n]) 

but1 = Button(abl1, text = "Quit", command = abl1.destroy).pack(side=BOTTOM) 
but2 = Button(abl1, text = "Start", command = start).pack() 
but3 = Button(abl1, text = "Stop", command = stop).pack() 

abl1.mainloop() 

공이 사각형의 가장자리에 도달하면 색을 변경해야합니다. 이제이 색상 목록과 if와는 아무런 관계가 없으며 무엇이 잘못되었는지 알지 못합니다. 나는 많은 다른 변종을 시도했지만 어느 쪽도 일하지 않았다. 도움 주셔서 감사합니다.파이썬에서 색상을 변경하는 방법은 무엇입니까?

답변

1

이동 기능에서 각 반복마다 itemconfig() 채우기 매개 변수를 설정해야합니다. can1.create_oval()을 호출하면 첫 번째 인수로 itemconfig() 메서드에 전달할 수있는 타원형의 ID가 반환됩니다. 그런 다음 아래 코드 에서처럼 채우기를 설정할 수 있습니다. 이 방법을 코딩하는 가장 효율적인 방법은 아닙니다. 모든 전역에서이 스크립트를 클래스로 만드는 것이 가장 좋습니다. 내 여전히 주어진 조건에 해당하는 모든 반복에 호출되고 있기 때문에 우리의 답변 모두 기술적으로 혼합

def move(): 
    global x1, y1, dx, dy, flag, n 

    x1, y1 = x1 + dx, y1 + dy 

    if x1 > 360: 
     n = 1 
     x1, dx, dy = 360, 0, 15 
     can1.itemconfig(1, fill=color[n]) 

    if y1 > 360: 
     n = n + 2 
     y1, dx, dy = 360, -15, 0 
     can1.itemconfig(1, fill=color[n]) 

    if x1 < 10: 
     n = 2 
     x1, dx, dy = 10, 0, -15 
     can1.itemconfig(1, fill=color[n]) 

    if y1 < 10: 
     n = 3 
     y1, dx, dy = 10, 15, 0 
     can1.itemconfig(1, fill=color[n]) 

    can1.coords(oval1, x1, y1, x1 + 30, y1 + 30) 

    if flag > 0: 
     abl1.after(50, move) 
+0

@req 올바른 것입니다. ;) – Jaredp37

2

x1 > 360 내부에 move()의 수표, n == 1n = 1이어야합니다.

n이 목록 색인으로 사용하는 변수라고 가정합니다. 그렇다면, 당신은 move()의 하단에 flag > 0 확인하기 전에 다음 줄을 추가해야합니다 : 당신이 원하는 것처럼

can1.itemconfig(oval1, fill=color[n]) 

는 색상을 변경해야한다고. 당신의 move()의 내 버전의

복사 - 붙여 넣기 :

def move(): 
    global x1, y1, dx, dy, flag, n 

    x1, y1 = x1 + dx, y1 + dy 

    if x1 > 360: 
     n = 1 
     x1, dx, dy = 360, 0, 15 

    if y1 > 360: 
     n += 2 
     y1, dx, dy = 360, -15, 0 

    if x1 < 10: 
     x1, dx, dy = 10, 0, -15 
     n = 2 

    if y1 < 10: 
     y1, dx, dy = 10, 15, 0 
     n = 3 

    can1.coords(oval1, x1, y1, x1 + 30, y1 + 30) 

    can1.itemconfig(oval1, fill=color[n]) 

    if flag > 0: 
     abl1.after(50, move) 

편집 : 나의 색을 함수가 호출 될 때마다 변경하려고하기 때문에 Jaredp37의 대답은 확실히, 나보다 더 효율적으로 될 것입니다.

관련 문제