2012-02-20 3 views
0

저는 Tkinter를 실험 해봤습니다. 필자는 엔트리 박스가 있고 그 아래에 두 개의 버튼 (Close와 OK)이있는 셋업을 가지고 있습니다. 닫기를 클릭하면 프레임이 파괴됩니다. 그 시간에 입력 상자에있는 모든 것을 반환하고 프레임을 파괴하길 원합니다. 나는 이것을하는 방법에 대한 손실에 처해있다.파이썬 Tkinter 버튼/엔트리 콤비네이션

또한
class App: 
    def DoThis(self): 
     #Earlier code that's not related to the question 
     v=StringVar() 
     e=Entry(f,textvariable=v) 
     buttonA=Button(f,text="Cancel",command=root.destroy) 
     buttonB=Button(f,text="OK") 

, 단지 바로 인쇄하지, 내가 호출하는 함수에 문자열을 반환 할 것을 유의하시기 바랍니다 :

은 ( f 내 프레임입니다) 내가 가진 무엇의 일부입니다.

내가 원하는 : 순간

print App().DoThis() #to print what was in the entry box 
#at the time of OK being clicked 
+0

"return"은 이벤트 기반 프로그램의 컨텍스트에서 의미가 없습니다. tne 값이 어디로 반환 될 것으로 예상합니까? –

+0

혼란을 해결하기 위해 더 많은 코드를 추가했습니다. –

답변

1

이 불가능 모든 의도와 목적을 위해, 물어 무엇 :

는 희망이 당신이 가야하는 완벽한 충분히 예이다. GUI가 화면에 표시되기 전에 기능 DoThis이 반환됩니다.

이렇게 말하기는 매우 드문 일이지만 그런 일이 가능합니다. 페라리의 진흙 투성이 밭을 가로 질러 건초를 베얼 수있는 방법을 묻는 것과 조금 다릅니다. 그냥 한 번 창을 팝업 계획이라면, 당신은 같은과

에 의해 얻을 수있는 다음

import Tkinter as tk 

class MyApp(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.entry = tk.Entry(self) 
     self.entry.pack() 
     close_button = tk.Button(self, text="Close", command=self.close) 
     close_button.pack() 
     self.string = "" 

    def close(self): 
     global result 
     self.string = self.entry.get() 
     self.destroy() 

    def mainloop(self): 
     tk.Tk.mainloop(self) 
     return self.string 

print "enter a string in the GUI" 
app = MyApp() 
result = app.mainloop() 
print "you entered:", result 

당신이 더 당신은 아마하지 않을거야 번 이상 창을 엽니 다하려는 경우 왜냐하면 Tkinter가 어떻게 사용되도록 설계 되었는가가 아니기 때문입니다.

+0

약간의 코드를 편집하여 전역 변수를 설정하는 대신 값을 직접 반환하도록했습니다. 어느 쪽이든, 당신은 대단히 도왔습니다. 정말 고마워요! –

0

당신은 root.destroy에, ButtonA가 취소 명령을 할당하고 있습니다. destroy 함수를 직접 호출하는 대신 값을 읽은 다음 destroy를 호출하는 별도의 함수를 만듭니다.

나는 보통 조금 더 쉽게하기 위해 프레임 클래스에서이 포장 :

import Tkinter 

class Frame(Tkinter.Frame): 

def __init__(self, root=None): 
    self.root = root 
    Tkinter.Frame.__init__(self, root) 

    # Create widgets 
    self.v = StringVar() 
    self.e = Entry(self, textvariable=v) 
    self.buttonA = Button(self, text="Cancel", command=cancel) 
    self.buttonB = Button(self, text="OK") 

def cancel(self): 
    print self.v.get() # handle value here 
    self.root.destroy() 
+0

문제는 값을 반환하기 위해서이며, 단순히'print self.v.get()'를'return self.v.get()'으로 변경하면'self.v.get()'를'__init__' 메인 클래스. –

0

는 기본적으로, 당신은 좀 더 복잡 버튼에서 콜백 기능을합니다. 단순히 destroy 메소드를 호출하는 것이 아니라 자신의 함수를 호출하는 것이 좋습니다. Entry 객체의 get 메소드를 사용하여 내용을 검색하십시오.

import Tkinter as tk 

class App: 
    def __init__(self, master): 
     self.display_button_entry(master) 

    def setup_window(self, master): 
     self.f = tk.Frame(master, height=480, width=640, padx=10, pady=12) 
     self.f.pack_propagate(0) 

    def display_button_entry(self, master): 
     self.setup_window(master) 
     v = tk.StringVar() 
     self.e = tk.Entry(self.f, textvariable=v) 
     buttonA = tk.Button(self.f, text="Cancel", command=self.cancelbutton) 
     buttonB = tk.Button(self.f, text="OK", command=self.okbutton) 
     self.e.pack() 
     buttonA.pack() 
     buttonB.pack() 
     self.f.pack() 

    def cancelbutton(self): 
     print self.e.get() 
     self.f.destroy() 

    def okbutton(self): 
     print self.e.get() 


def main(): 
    root = tk.Tk() 
    root.title('ButtonEntryCombo') 
    root.resizable(width=tk.NO, height=tk.NO) 
    app = App(root) 
    root.mainloop() 

main() 
+0

문제는 인쇄하지 않고 값을 반환하고 싶습니다. 만약 당신의 코드에서'print' 문을'return'으로 바꾸고 싶다면 단순히 메인 클래스가 아닌'display_button_entry'로 리턴 할 것입니다. –

+0

나는 당신의 코드를 더 많이보아야 하겠지만 내 생각 엔 당신이 뭔가 잘못하려하고 있다는 것입니다. 버튼에 값을 반환하지 않아야합니다. – jgritty

관련 문제