2014-07-08 2 views
0

tkinter를 사용하여 각 라벨의 색상을 수동으로 변경해야하는 상태 패널을 만들고 있습니다. 내가 팝업 콘솔에 명령을 발행 하여이 작업을하고 싶습니다. 대화 상자 (예 : redalert(stat1))에서 명령을 실행하고 매개 변수에서 명령을 분리하십시오. 이 같은 각 레이블에 대한 if 문 별도을 사용할 수Tkinter : 변수를 사용하여 라벨을 설정하기

if 'redalert' in command: 
    param = command.split('(')[1] 
    param = 'self.' + param.split(')')[0] 
     if param == 'self.stat1': 
      self.stat1.config(bg='red') 
     elif param == 'self.stat2': 
      self.stat2.config(bg='red') 

하지만이 일을 더 컴팩트 방법은 무엇입니까? 내가 param.config(bg='red')라고 말하면 문자열 값 대신 문자열을 구성하려고한다고 생각합니다.

from Tkinter import * 

class App: 
    def __init__(self, master): 
     self.stat1 = Label(text="Stat 1", bg='#990000', bd=3, relief=SOLID, padx=30, pady=20) 
     self.stat2 = Label(text="Stat 2", bg='#990000', bd=3, relief=SOLID, padx=30, pady=20) 
     self.stat3 = Label(text="Stat 3", bg='#990000', bd=3, relief=SOLID, padx=30, pady=20) 
     self.stat4 = Label(text="Stat 4", bg='#990000', bd=3, relief=SOLID, padx=30, pady=20) 
     self.stat5 = Label(text="Stat 5", bg='#990000', bd=3, relief=SOLID, padx=30, pady=20) 
     self.stat6 = Label(text="Stat 6", bg='#990000', bd=3, relief=SOLID, padx=30, pady=20) 
     self.stat7 = Label(text="Stat 7", bg='#990000', bd=3, relief=SOLID, padx=30, pady=20) 
     self.stat8 = Label(text="Stat 8", bg='#990000', bd=3, relief=SOLID, padx=30, pady=20) 
     self.stat9 = Label(text="Stat 9", bg='#990000', bd=3, relief=SOLID, padx=30, pady=20) 
     self.stat10 = Label(text="Stat 10", bg='#990000', bd=3, relief=SOLID, padx=26, pady=20) 
     self.stat11 = Label(text="Stat 11", bg='#990000', bd=3, relief=SOLID, padx=26, pady=20) 
     self.stat12 = Label(text="Stat 12", bg='#990000', bd=3, relief=SOLID, padx=26, pady=20) 
     self.stat13 = Label(text="Stat 13", bg='#990000', bd=3, relief=SOLID, padx=26, pady=20) 
     self.stat14 = Label(text="Stat 14", bg='#990000', bd=3, relief=SOLID, padx=26, pady=20) 
     self.stat15 = Label(text="Stat 15", bg='#990000', bd=3, relief=SOLID, padx=26, pady=20) 
     self.stat16 = Label(text="Stat 16", bg='#990000', bd=3, relief=SOLID, padx=26, pady=20) 
     self.stat1.grid(row=0, column=0) 
     self.stat2.grid(row=0, column=1) 
     self.stat3.grid(row=0, column=2) 
     self.stat4.grid(row=0, column=3) 
     self.stat5.grid(row=1, column=0) 
     self.stat6.grid(row=1, column=1) 
     self.stat7.grid(row=1, column=2) 
     self.stat8.grid(row=1, column=3) 
     self.stat9.grid(row=2, column=0) 
     self.stat10.grid(row=2, column=1) 
     self.stat11.grid(row=2, column=2) 
     self.stat12.grid(row=2, column=3) 
     self.stat13.grid(row=3, column=0) 
     self.stat14.grid(row=3, column=1) 
     self.stat15.grid(row=3, column=2) 
     self.stat16.grid(row=3, column=3) 
     root.bind("<F1>", self.callConsole) 
    def callConsole(self, master): 
     self.commandConsole = Console(root) 
     root.wait_window(self.commandConsole.top) 
     command = self.commandConsole.commandVar 
     if 'redalert' in command: 
      param = command.split('(')[1] 
      param = 'self.' + param.split(')')[0] 
      if param == 'self.stat1': 
       self.stat1.config(bg='red') 
      elif param == 'self.stat2': 
       self.stat2.config(bg='red') 
class Console: 
    def __init__(self, master): 
     self.top = Toplevel() 
     self.top.transient(root) 
     self.command = Entry(self.top, font=("Helvetica", 15)) 
     self.command.grid(row=0, column=0) 
     self.command.focus_set() 
     self.top.bind("<Return>", self.execute) 
    def execute(self, master): 
     self.commandVar = self.command.get() 
     self.top.destroy() 
root = Tk() 
app = App(root) 
root.mainloop() 
root.destroy() 

답변

1

내가 대신 자신의 변수에 각 하나를 필요없이 목록에서 통계를 모두 저장하는 것이 좋습니다 :

여기에 전체 코드입니다. 그런 다음 색인이 있으면 특정 통계에 쉽게 액세스 할 수 있습니다.

class App: 
    def __init__(self, master): 
     self.stats = [] 
     idx = 0 
     for i in range(4): 
      for j in range(4): 
       stat = Label(text="Stat {}".format(idx+1), bg='#990000', bd=3, relief=SOLID, padx=30, pady=20) 
       stat.grid(row=i, column=j) 
       self.stats.append(stat) 
       idx += 1 
     root.bind("<F1>", self.callConsole) 
    def callConsole(self, master): 
     self.commandConsole = Console(root) 
     root.wait_window(self.commandConsole.top) 
     command = self.commandConsole.commandVar 
     if 'redalert' in command: 
      digits = [c for c in command if c.isdigit()] 
      number = int("".join(digits)) 
      self.stats[number-1].config(bg="red") 

은 (callConsole에 사용 된 번호 추출 기술은 실증 목적이며 이상한 입력 매우 관대 때문에, 당신의 목적에 적합하지 않을 수 있습니다. 예를 들어, 사용자가 foo에에게 "1 redalert 2 troz를 입력 할 수 있습니다 "라고 말하면 12 번째 빛이됩니다)

+0

감사합니다. 나는 한 가지 질문 만 가지고있다. stat 1-12가 아닌 각 라벨에 고유 이름을 사용하려면 어떻게해야합니까? –

+0

목록 대신 목록을 사용할 수 있습니다. 키는 이름이고 값은 레이블입니다. 그런 다음 이름에 문자열이 있으면 stat에 액세스 할 수 있습니다. – Kevin

+0

다시 한번 감사드립니다. 나는 그것을 시도 할 것이다. –

관련 문제