2012-07-23 4 views
0

그래서 게임을 만들고 있는데 GUI를 추가하기로 결정했습니다. 다음과 같이 GUI 코드가 표시됩니다 :Tkinter를 사용하는 Python GUI 프로그래밍

master = Tk() 
master.wm_title("Main Menu") 

a = Button.grid(master, text = "DOMINATE!", command = difficulty) 
a.grid(row = 0, column = 0) 
a.pack() 
mainloop() 

b = Button.grid(master, text = "Patch Notes", command = changelog) 
b.grid(row = 0, column = 1) 
b.pack() 
mainloop() 

c = Button.grid(master, text = "Credits", command = credit) 
c.grid(row = 1, column = 0) 
c.pack() 
mainloop() 

d = Button.grid(master, text = "Rules", command = rules) 
d.grid(row = 1, column = 1) 
d.pack() 
mainloop() 

e = Button.grid(master, text = "Quit", command = exit) 
e.grid(row = 2, column = 0) 
e.pack() 
mainloop() 

가 이미 Tkinter의에서 * 기능을 가져온이 코드의 내 1200 개 라인의 스 니펫이다.

형식 오류 : 나는 그것을 실행하려고 할 때,이 오류 얻을) 언 바운드 방법 grid_configure을 (첫 번째 인수로 Button 인스턴스 호출해야

(파이썬은 새로운 언어의 종류 (대신 Tk의 인스턴스를 가지고) 나를 위해 너무 분명하거나 어리석은 아무것도 놓친 것에 대해 유감스럽게 생각합니다. 프로그래밍에 익숙하지 않습니다.) 가능성이 컴퓨터를 사용하지 않을 것입니다 (또는 심지어 같은 위젯 이내) 같은 위젯을 packgrid를 사용

a.grid(...) 
a.pack(...) 

을하지 않는다, 또한

a = Button(master, text = "DOMINATE!", command = difficulty) 
a.grid(row=...,column=...) 

:

+7

'Button.grid'의 모든 인스턴스를'Button (' – Kevin

+0

)으로 대체 해보십시오. 비슷한 원리를 3 번 ​​이상 반복한다면 루프를 사용하십시오. –

+0

@JoelCornett - 이것은 다소 clunky 한 루프 일 것입니다. (반복 할 때마다'text','command','row' 및'column'을 변경해야합니다.) 불가능하지는 않지만, 코드를 더 명확하게 ... – mgilson

답변

0

오류 "언 바운드 방법 grid_configure은() ... 버튼 인스턴스를 호출해야"과 같이 라인에서 온다 :

a = Button.grid(...) 

위는에 grid 메소드를 호출하려고한다 무엇 Button 클래스가 아니라 Button 클래스의 인스턴스가 있어야합니다. 일반적으로 "언 바운드 메서드"오류는 인스턴스가 아닌 클래스에서 메서드를 호출하려고한다는 것을 의미합니다.

대신에 Button 클래스의 인스턴스를 만든 다음 인스턴스에 grid을 호출해야합니다. 예를 들면 다음과 같은 두 pack 위젯을 사용하고 grid

또한
a = Button(...) 
a.grid(...) 

는 이해되지 않는다. 둘 중 하나를 사용하십시오. grid을 사용하는 경우 pack으로 전화 할 필요가 없습니다.

마지막으로 mainloop은 모든 위젯을 만든 후에 정확히 한 번 호출하도록 설계되었습니다.

내 경험에 따르면 모든 레이아웃 코드 (grid, packplace)를 함께 사용하면 GUI 코드가 훨씬 쉽게 유지 관리 할 수 ​​있습니다. 반드시 전체 앱에 대해 모두 함께 사용할 필요는 없지만 적어도 포함하는 창으로 그룹화하십시오. 예를 들어 다음 대신 :

a = Button(...) 
a.grid(...) 
b = Button(...) 
b.grid(...) 
... 

...나는 이런 식으로 일을하는 것이 좋습니다 :

a = Button(...) 
b = Button(...) 
... 
a.grid(...) 
b.grid(...) 
주요 오류에서 오는 등 코드 구성의 이런 종류가 쉽게와 같은 동일한 행 또는 열에서 여러 항목을 가진 것으로 레이아웃 문제를 발견 할 수

,

+0

문제를 해결하고 문제를 해결하도록 도와 주셔서 감사합니다. 나는 당신의 GUI 프로그래밍 조직 방법을 취하여 적용 할 것이다. 다시 한 번 감사드립니다! – user1546859

1

당신은 뭔가를 원하는 거기에 앉아 두 기하학 관리자 사이의 합리적인 레이아웃을 협상하려고 애썼다. 팩만 사용하거나 그리드 만 사용하십시오.

마지막으로 mainloop() 만 필요합니다. 다른 모든 코드는 제거해야합니다. 코드가 1200 라인이라도이 코드를 수정하면 다른 오류가 발생할 수 있습니다.

1

Button 인스턴스가 아닌 '마스터'

a = Button.grid(master, text = "DOMINATE!", command = difficulty) 

대신 수행

a = Button(master, text = "DOMINATE!", command = difficulty) 
Button.grid(master.a,row=0,column=0,rowspan=1,columnspan=1,sticky='wens') 

격자 배치를위한 선은 Tkinter Old-style 클래스에 대해 Button 수퍼 클래스 격자 방법을 사용합니다. 하지만 당신은 그래서 당신이 할 수있는 것을 필요로하지 않는 것 :

a.grid(master.self,row=0,column=0,rowspan=1,columnspan=1,sticky='wens') 

일 :

a = Button(master, text = "DOMINATE!", command = difficulty).grid(row=0,column=0,rowspan=1,columnspan=1,sticky='wens') 

"는"호출 후 Button 인스턴스되지 않습니다, 그것은 동일한 그리드 인스턴스 수있는 바와 같이, ~ 타입 없음. 작성 및 배치를 모두 분할하십시오.

+0

"그리드 인스턴스가 될 것입니다"라는 잘못된 용어입니다. 그것은 _grid 인스턴스가 아니며, 그리드 함수에 의해 반환 된 값이 될 것입니다. –