2014-12-17 2 views
0

처음으로 파이썬에서 tkinter를 사용하여 GUI를 만들었습니다. wxPython을 사용해 보았지만 같은 문제는 없었지만 캔버스는 사용하지 않았습니다. 캔버스 뒤의 사고 과정은 결국 애니메이션을 추가하는 것입니다. 나는 하나의 그리드가 캔버스 인 그리드 레이아웃을 만들었다. itemconfig를 사용하여 점수 필드를 업데이트하려고 시도 중입니다. 행운을 빌어 두 점수 필드를 캔버스에서 업데이트하려고합니다. 내 코드는 아래와 같습니다. 캔버스에서 두 점수를 업데이트하는 방법에 대한 권장 사항은 무엇입니까? 새 점수가 화면에 표시되기 전에 이전 점수를 삭제하겠습니다. 봐 주셔서 감사합니다. 지구상을 용서하십시오, 이것은 진행됨에 따라 제거되어야합니다.tkinter 캔버스에서 텍스트 필드 업데이트

class Gui(Frame): 
def __init__(self, root): 
    self.root=root 
    self.initUI() 

def initUI(self): 
    global score1, score2 # these are ints 
    score1str = str(score1) 
    score2str = str(score2) 

    root.title("Table Tennis Scoreboard") 

    self.canvas = Canvas(root, width=640, height=480, background='green') 
    self.canvas.grid(row=0,column=1) 

    self.canvas.create_text(185, 90, anchor=W, font=('Calibri', 20), 
              text="Let's play Table Tennis!") 

    self.canvas.create_rectangle(75, 120, 275, 320, outline="red", fill="red") 
    self.canvas.create_rectangle(370, 120, 565, 320, outline="blue", fill="blue") 

    self.canvas.create_text(125, 130, anchor=W, font=('Calibri', 20), 
              text="Player 1") 
    self.canvas.create_text(425, 130, anchor=W, font=('Calibri', 20), 
              text="Player 2") 

    self.score1_id = self.canvas.create_text(135, 250, anchor=W, font=('Arial', 100), 
              text=score1str) 
    self.score2_id = self.canvas.create_text(435, 250, anchor=W, font=('Arial', 100), 
              text=score2str) 

    frame = Frame(self.root, relief=RAISED, borderwidth=2, background='white') 
    frame.grid(row=0,column=0) 

    p1up = Button(frame,text="Player1 +1", height=2, width=10, background='red', command=self.add('one')) 
    p1up.grid(row = 0,column = 0, padx=10, pady=(20,5)) 
    p1down = Button(frame,text="Player1 -1", height=2, width=10, background='red', command=self.subtract('one')) 
    p1down.grid(row = 1,column = 0, padx=10, pady=(5,100)) 
    p2up = Button(frame,text="Player2 +1", height=2, width=10, background='blue', command=self.add('two')) 
    p2up.grid(row = 3,column = 0, padx=10, pady=5) 
    p2down = Button(frame,text="Player2 -1", height=2, width=10, background='blue', command=self.subtract('two')) 
    p2down.grid(row = 4,column = 0, padx=10, pady=(5,100)) 
    reset = Button(frame,text="Reset", height=2, width=10, command=self.new_game()) 
    reset.grid(row = 6,column = 0, padx=10, pady=(5,20)) 

def new_game(self): 
    global score1, score2 # these are ints 
    score1 = 0 
    score2 = 0 
    self.update_score() 

def add(self, player): 
    global score1, score2 # these are ints 
    self.player = player 
    if self.player == 'one': 
     #if score1 < 11: 
     score1 += 1 
    elif self.player == 'two': 
     #if score2 < 11: 
     score2 += 1 
    self.update_score() 
    return 

def subtract(self, player): 
    global score1, score2 # these are ints 
    self.player = player 
    if self.player == 'one': 
     if score1 > 0: 
      score1 = score1 - 1 
    elif self.player == 'two': 
     if score2 > 0: 
      score2 -= 1 
    self.update_score() 
    return 

def update_score(self): 
    global score1, score2 # these are ints 

    score1str = str(score1) 
    score2str = str(score2) 

    self.canvas.itemconfig(self.score1_id, text=score1str) 
    self.canvas.itemconfig(self.score2_id, text=score2str) 

    return 

if __name__== '__main__': 
    root=Tk() 
    gui=Gui(root) 
    root.mainloop() 
+0

"행운"은 무엇을 의미하지 않는다? 오류가 있습니까? 프로그램이 충돌합니까? 잘못된 단어가 나타 납니까? –

+0

캔버스 항목, 즉 텍스트를 삭제 한 다음 새 텍스트로 create_text 문을 수행합니다. http://effbot.org/tkinterbook/canvas.htm의 삭제 예제를보십시오 –

+0

점수가 업데이트되지 않는다는 점에서 운이 좋지는 않습니다. 초보자 라 할지라도 프로그램이로드되고 인터페이스가 멋지게 보입니다. 내가 원하는 것은 버튼을 눌렀을 때 점수가 업데이트된다는 것입니다. 캔버스에서 필드를 삭제하고 다시 만들려고했으나 아무런 결과가 나타나지 않고 아무 버튼을 눌러도 첫 번째로로드 된 후 점수가 변경되지 않습니다. – Sherd

답변

2

문제는 단추에 기능을 할당하지 않고 함수 호출의 값을 반환한다는 것입니다. 예를 들어 : 명령에

reset = Button(frame,text="Reset", height=2, width=10, command=self.new_game()) 

를 할당 None, 즉 무엇을 self.new_game() 반환이기 때문에.

reset = Button(frame,text="Reset", height=2, width=10, command=self.new_game) 
버튼의 명령에 기능 self.new_game를 할당

, 대신 None : 당신은이를 변경해야합니다.

p1up = Button(frame,text="Player1 +1", height=2, width=10, background='red', command=lambda: self.add('one')) 

이 버튼의 Section 명령에 self.add('one')를 호출하는 익명 함수를 할당합니다

그런 다음, 다른 버튼에, 당신이 좋아하는 람다 함수를 사용해야합니다 버튼의 명령에 인수를 전달합니다.

또한 참조 : Why is Button parameter "command" executed when declared?

+0

물론. wxPython도 같은 방법입니다. 나는 막 자바 스크립트 페이지를 하루 만에 코딩했기 때문에이 오류를 완전히 놓쳤다. 매력처럼 일했습니다! 감사! – Sherd

관련 문제