2017-09-12 1 views
0

저는 파이썬 스킬 (특히 OOP)을 개발하기 위해 몬스터 마스터라고 불리는 카드 게임을 만들고 있습니다.파이썬 tkinter 버튼이 표시되지 않습니다.

저는 몇 가지 정적 객체가있는 GUI를 가지고 있습니다 : 플레이어 1의 테이블 측면, 플레이어 2의 측면, 가운데에 연소 선, 그리고 이제 '끝 회전'버튼을 구현하려고합니다.

이 버튼을 표시하기 위해 여러 가지를 시도했지만 오류가없는 경우에도 표시되도록 설정할 수 없습니다. 그냥이 버튼으로 문제를 이해하기 위해 일시적으로 제거한 몇 줄의 주석 처리 된 줄이 있다고 말하면됩니다. 나는 자신의 스크립트를 시도했지만 작동이 중단 때이 프로그램 안에 넣을 때

def RunGame(): 
class App(): 
    """docstring for App""" 

    def draw(): 
     # Setting up canvas dimensions 

     canvas_width = 640 
     canvas_height = 480 

     master = Toplevel() 
     master.title("Monster Master by Charles Cameron - Game") 
     master.resizable(width=False, height=False) 
     master.geometry("640x480") 

     w = Canvas(master, 
        width=canvas_width, 
        height=canvas_height) 
     w.pack() 

     # Drawing static objects 
     CentrePoints = [(0, canvas_height/2), (canvas_width/2, canvas_height/2), 
      (canvas_width, canvas_height/2)] 
      #Left, centre and right centres (save me from retyping them) 

     Player1Area = w.create_rectangle(CentrePoints[0], canvas_width, 
      canvas_height, fill="#303AFE") #Player1 Area 
     Player2Area = w.create_rectangle(0, 0, CentrePoints[2], 
      fill="#C31B1B") #Player2 Area 

     Barrier = w.create_line(CentrePoints[0], CentrePoints[2], 
      fill="#0090E3", width=20) # Centre barrier 

     # class GameBtn(): 
     # class EndTurnBtn(): 
     #  def __init__(self, BtnName, master): 
     BtnName = Button(master, bg="white", command=lambda:print("Clicked!")) 

     image = ImageTk.PhotoImage(file="imgs\EndTurn.png") 
     BtnName.config(image=image, width="70", height="70") 

     BtnName.pack(side=RIGHT) 

     # ChangeTurn = GameBtn.EndTurnBtn('ChangeTurn', master) 

     master.mainloop() 

Window = App() 
App.draw() 

실제 버튼의 버튼 코드가 ​​잘 작동 : 여기

내가 현재 시도 사용하고 코드입니다 .

질문하기가 너무 바보 같은 질문이 아니며, 파이썬에서의 아마추어도 여전히 정직하게 온라인에서 답변을 찾을 수 없습니다.

많은 감사합니다.

+0

- 당신의''image''의 가변적이고 번 범위를 벗어나면 버튼이 공백이됩니다. 페이지 하단의 참고 사항 - http://effbot.org/tkinterbook/photoimage.htm –

+0

실제로 루트 창과 새 창을 모두 사용하지 않는 한 TopLevel을 사용하거나 사용하지 않아야합니다. 나는 당신의 코드가 다른 이슈들도 가지고 있다고 생각한다. (예를 들어 ImageTK는 무엇인가?) –

답변

2

버튼이 있지만 창 가장자리를 벗어났습니다. 이는 창을 640x480으로 만든 다음 완전히 640x480 캔버스로 채 웠기 때문입니다. master.geometry("640x480") 행을 제거하면 캔버스와 버튼을 모두 포함하도록 창이 늘어납니다.

"버튼이 캔버스 옆에 나타나지 않게하고 싶습니다. 버튼을 캔버스에 놓고 싶습니다. 배경의 색을 지정하고 싶었 기 때문에 캔버스가 실제로 존재합니다. ". 캔버스에 위젯을 삽입하려면 create_window (How to place a widget in a Canvas widget in Tkinter? 참조)이지만 프레임 오브젝트를 함께 쌓아 개별 색상을 지정하여 컬러 배경을 만드는 것이 더 실용적 일 수 있습니다. 예 :

from tkinter import Tk, Frame, Button 

root = Tk() 
root.geometry("640x480") 
top_player_frame = Frame(root, height=230, bg="red") 
barrier = Frame(root, height=20, bg="green") 
bottom_player_frame = Frame(root, height = 230, bg="blue") 

#configure column 0 so frames can stretch to fit width of window 
root.columnconfigure(0, weight=1) 

top_player_frame.grid(row=0, sticky="we") 
barrier.grid(row=1, sticky="we") 
bottom_player_frame.grid(row=2, sticky="we") 

bottom_player_end_turn_button = Button(bottom_player_frame, text="End Turn") 
#use `place` here because `pack` or `grid` will collapse the frame to be only as tall as all the widgets it contains, i.e. just this button 
bottom_player_end_turn_button.place(x=10,y=10) 

root.mainloop() 

결과 :

enter image description here

또한 Tkinter의 객체에 대한 참조를 유지하지 않는 한, 당신의 photoimage 개체가 그대로 유지되도록해야
+0

그 답은 매우 고맙게 느껴진다. 문제를 해결하지 못하는 것 같다. 나는 이미지를 만드는 데 문제가있다. 나는 TkImage 및/또는 photoimage를 사용하려고 노력해 왔지만 이미지 매개 변수에 전달한 것과 상관없이 'image pyimage1은 존재하지 않습니다'라는 문제를 겪어 왔습니다. – MrMeowMeow

+0

@MrMeowMeow, [PhotoImage 조기 가비지 수집 버그] (http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm)가 원인 일 수 있습니다. 해당 페이지에 설명 된 수정 사항이 도움이되지 않으면 이미지 버튼 문제를 설명하는 새 게시물을 작성하십시오. – Kevin

관련 문제