2014-09-11 2 views
0
import sys 
from tkinter import * 

def run_GUI(): 
    # create the window 
    root = Tk() 
    frame = Frame(root) 
    frame.pack() 

    #modify root window 
    root.title("Simple GUI") 
    root.geometry("700x300") # w x h   
    def SP2T():  # Edit occurs here where I forgot to pit that the button was created in a called funtction 
     #Creates Row 
     frameSP2T = Frame(root) 
     frameSP2T.pack(side = TOP) 

     #Creating Buttons First Row 
     button1 = Button(frameSP2T, padx=13, pady = 6, bd=4, text="SW02",fg = "black", command = SW02) 
     button1.pack(side = LEFT) 

    def SW02(): 
     print("SW02 is on") 
     button1["fg"] = "green" 

    #Sets up initial boot screen 
    #Creates Row 
    topframe = Frame(root) 
    topframe.pack(side = TOP) 

    #Creating Buttons First Row 
    buttonA = Button(topframe, padx=13, pady = 6, bd=4, text="SP2T",fg = "black", command = SP2T) 
    buttonA.pack(side = LEFT) 

    buttonB = Button(topframe, padx=12, pady = 6, bd=4, text="SP4T",fg = "black") 
    buttonB.pack(side = LEFT) 

    buttonC = Button(topframe, padx=12, pady = 6, bd=4, text="SP12T",fg = "black") 
    buttonC.pack(side = LEFT) 

    buttonD = Button(topframe, padx=12, pady = 6, bd=4, text="QUIT", fg="red",command=frame.quit) 
    buttonD.pack(side = LEFT) 

    #Kick off event loop 
    root.mainloop() 
    return 

run_GUI() 

에 버튼 색상을 변경 그리고 오류 가지고 :파이썬 GUI

Traceback (most recent call last): 

    File "C:\Python34\lib\tkinter\__init__.py", line 1487, in __call__ 

    return self.func(*args) 

    File "C:\Python34\gui_attempt.py", line 25, in SW02 

    button1["fg"] = "green" 

NameError: name 'button1' is not defined 

업데이트 버전 잘하면 전체 그림을 보여줍니다

는 라인 (60)을 말한다 이유는 그래서이 프로그램에 더가있다

,하지만 이것은 문제 영역입니다. 눌렀을 때 버튼의 색상을 변경하려고합니다.

+2

tkinter 가져 오기에서 추가 한 후에도 오류를 실제로 재현하는 [최소 예제] (http://stackoverflow.com/help/mcve)를 제공하십시오. *'(하지 말아야 할)'NameError : name 'SW02'is is 정의되지 않음'함수가 * Button * 정의에서 참조 된 이후에 * 정의되어 있기 때문에, 주위를 바꾸면 오류없이 실행됩니다. – jonrsharpe

+0

두 가지 사소한 변경 (추가 된 가져 오기,'Button '을 만들기 전에 이동 된 함수 정의)을 사용하면 게시 한 코드가 저에게 효과적입니다. 따라서 ** 다른 사람들이 당신의 문제가 무엇인지 정확히 알 수 있도록 최소한의 예 **를 제공해주십시오. http://sscce.org를 참조하십시오. – jonrsharpe

+0

죄송합니다. 이것은 내 첫 번째 게시이므로 인내심에 감사드립니다. – lherron8

답변

2

간단한 수정 해당 개체에 액세스해야하는 두 함수의 시작 global button을 추가하는 것입니다

import tkinter as tk 

class MyGui(tk.Tk): 

    def __init__(self): 
     super(MyGui, self).__init__() 
     self.create_widgets() 


    def create_widgets(self): 
     self.frame = tk.Frame(self) 
     self.frame.pack() 
     self.buttonA = tk.Button(self.frame, padx=13, pady=6, bd=4, text="SP2T", 
           fg="black", command=self.SP2T) 
     self.buttonA.pack(side=tk.LEFT) 

    def SW02(self): 
     print("SW02 is on") 
     self.button1["fg"] = "green" 

    def SP2T(self): 
     self.button1 = tk.Button(self.frame, padx=13, pady=6, bd=4, text="SW02", 
           fg="black", command=self.SW02) 
     self.button1.pack(side=tk.LEFT) 

if __name__ == "__main__": 
    root = MyGui() 
    root.mainloop() 
+1

이것은 파이썬 3.x이기 때문에 여기서'global'을 필요로하지 않고'nonlocal'을 사용하여 클로저에 저장할 수 있습니다. 기술적으로 이것은 객체를 생성하는 것과 같습니다. 하지만 실제적으로, 당신이 보여준 것과 똑같은 경우에 대해 OO를 사용하는 것은 훨씬 더 파이썬 적입니다. – abarnert

+0

이것은 아마도 놀랍게도 어리석은 질문 일뿐입니다.하지만 코드를 수정하여 클래스를 만들었지 만, 이제는 모든 것이 함수에 정의되어 있고 설정 한 경우 아무 것도 실행되지 않습니다. 하단의 if 문은 프로그램을 실행한다고 가정합니까? 내 모든 함수를 정의한 후 create_widgets (self)를 호출 해 보았습니다. 그러나 GUI 상자 만 나타나고 버튼은 없습니다. 나는 내 질문을 지금 내가 가지고있는 것으로 업데이트 할 것이다. – lherron8

+0

@ lherron8 http://stackoverflow.com/q/419163/3001761 – jonrsharpe

0

당신은 scope 문제를 다루고 있습니다. 함수의 범위에없는 개체를 수정하려고하기 때문에 예외가 함수 SW02()에서 발생합니다. 당신은 그것을 전달해야 다음에 SW02()을 변경합니다..

def SW02(button1): 
    print("SW02 is on") 
    button1["fg"] = "green" 

당신이 명령에 대한 조치로 기능을 사용하고 있기 때문에, 당신은 실제로 그것을 전달하는 몇 가지 옵션이

사용 람다 :

button1 = Button(frameSP2T, padx=13, pady = 6, bd=4, text="SW02",fg = "black", command = lambda: SW02(button1)) 

사용 functools.partial : 또는

from functools import partial 
# other stuff 
_SW02 = partial(SW02, button1) 
button = Button(frameSP2T, padx=13, pady = 6, bd=4, text="SW02",fg="black", command=_SW02) 

, jonrsharpe의 답변에서 제안한 것처럼 전체 GUI 기능을 클래스로 리팩토링하고 모든 위젯을 클래스 멤버로 만든 다음 일반 기능 대신 클래스 메서드로 위젯 작업을 연결할 수 있습니다. 그렇게하면 GUI 구성 요소를 수정하는 모든 기능에 액세스 할 수 있습니다. 대신, 당신이 걸릴 수 있습니다 -

def SP2T(): 
    global button1 
    ... 

def SW02(): 
    global button1 
    ... 

그러나 global의 사용이 나쁜 기호는 일반적으로 :

+0

세계는 변화를 가져 오지 않았습니다. – lherron8

+0

죄송합니다. 나는 또한 새로운 Python에 익숙해 져서 새로운 질문과 새로운 python에 대한 새로운 조합이 내 원래의 게시물을 괴롭혔다. 따라서 : button1 = 버튼 (frameSP2T, padx = 13, pady = 6, bd = 4, text = "SW02", fg = "black", command = SW02 (button1)) button1.pack (side = LEFT) (SW02가 켜짐) button1 [ "fg"] = "초록색" – lherron8

+0

새로운 라인의 def02 (input_button)을 가지고 – lherron8