2016-09-30 3 views
0

선택한 라디오 버튼의 값을 가져 오는 데 문제가 있습니다. 현재 라디오 버튼에서 사용하는 내 변수에 .get() 함수를 사용하면 아무 것도 반환하지 않습니다. .get() 함수없이 메시지 상자를 사용하면 PY_VAR x를 반환합니다. 여기서 x는 tkinter 변수의 특정 인스턴스입니다.Tkinter 라디오 버튼 액세스 문제 CTRL var

라디오 버튼은 한 번에 하나의 라디오 버튼 만 선택할 수 있다는 사실에서 알 수 있듯이 변수를 올바르게 사용하지만 값을 제대로 읽을 수 없습니다. 나는 현재 선택을 읽고 그것을 다른 변수에 넣고 싶다.

다음은 요약 된 코드입니다 (프로그램의 라디오 버튼 부분 만 볼 수 있습니다).

from tkinter import * 
from tkinter import messagebox, ttk 

class init_system: 
    def __init__(self): 
     self.init_vars = {"w_audiocodec": "Windows Media Audio 9.2 Lossless"} 

class render_window: 
    def __init__(self, height, width, window_title): 
     self.root_window = Tk() 
     w = width 
     h = height 
     ws = self.root_window.winfo_screenwidth() # width of the screen 
     hs = self.root_window.winfo_screenheight() # height of the screen 
     x = (ws/2) - (w/2) 
     y = (hs/2) - (h/2) 
     self.root_window.title(window_title) 
     self.root_window.minsize(width, height) 
     self.root_window.geometry('%dx%d+%d+%d' % (w, h, x, y)) 
     self.master_dictionary = {"radio_ctrl": StringVar()} 

    def new_button(self, button_text, button_command="", grid_row=0, grid_column=0, grid_sticky="NESW", grid_columnspan=1, grid_rowspan=1): 
     self.button = ttk.Button(self.root_window, text=button_text, command=button_command) 
     self.button.grid(row=grid_row, column=grid_column, sticky=grid_sticky, columnspan=grid_columnspan, rowspan=grid_rowspan) 
     self.responsive_grid(grid_row, grid_column) 

    def new_label(self, label_text, text_alignment="center", grid_row=0, grid_column=0, grid_sticky="NESW", grid_columnspan=1, grid_rowspan=1): 
     self.label = ttk.Label(self.root_window, text=label_text, anchor=text_alignment) 
     self.label.grid(row=grid_row, column=grid_column, sticky=grid_sticky, columnspan=grid_columnspan, rowspan=grid_rowspan) 
     self.responsive_grid(grid_row, grid_column) 

    def responsive_grid(self, row_responsive=0, column_responsive=0, row_weight_num=1, column_weight_num=1): 
     self.root_window.grid_columnconfigure(column_responsive, weight=column_weight_num) 
     self.root_window.grid_rowconfigure(row_responsive, weight=row_weight_num) 

    def new_radio_button(self, widget_text="Radio Button", radio_value="Radio Btn", radio_command="", grid_row=0, grid_column=0, grid_sticky="NESW", grid_columnspan=1, grid_rowspan=1): 
     self.radio_button = ttk.Radiobutton(self.root_window, text=widget_text, variable=self.master_dictionary["radio_ctrl"], value=radio_value, command=radio_command) 
     self.radio_button.grid(row=grid_row, column=grid_column, sticky=grid_sticky, columnspan=grid_columnspan, rowspan=grid_rowspan) 
     self.responsive_grid(grid_row, grid_column) 

class change_var_window(render_window): 

    change_var_window_values = {"example_data_below": "Check it out!", 
    "var_to_change": "show_ui", 
    "toggle": False, 
    "radio": False, 
    "free_form":False, 
    "line_one": "Current value of:", 
    "line_two": "some varible name here passwed with a dicrionary", 
    "Custom_Data_Bool": False, 
    "Custom_Disable": "Enable me", 
    "Custom_Enable": "Disable me", 
    "radio_list": [("Radio Button 1", "btn_1"), ("Radio Button 2", "btn_2"), ("Radio Button 3", "btn_3")], 
    "is_number": True} 

    def save_radio_var(self): 
     vars_system.init_vars[self.change_var_window_values["var_to_change"]] = self.master_dictionary["radio_ctrl"].get() 
     messagebox.showinfo("debug", self.master_dictionary["radio_ctrl"].get()) 

    def create_change_var_window(self): 
     self.new_label(self.change_var_window_values["line_one"], grid_columnspan=2) 
     self.new_label(self.change_var_window_values["line_two"], grid_row=1, grid_columnspan=2) 
     if self.change_var_window_values["radio"]: 
      grid_placement = 2 
      self.master_dictionary["radio_ctrl"] = StringVar() 
      #self.master_dictionary["radio_ctrl"].set(vars_system.init_vars[self.change_var_window_values["var_to_change"]]) 
      for radio_name, value in self.change_var_window_values["radio_list"]: 
       self.new_radio_button(widget_text=radio_name, radio_value=value, grid_row=grid_placement) 
       grid_placement +=1 
      grid_placement -=1 
      self.new_button("Cancle", self.root_window.destroy, grid_row=grid_placement, grid_column=1) 
      grid_placement -=1 
      self.new_button("Save", self.save_radio_var, grid_row=grid_placement, grid_column=1) 
      # Radio Requires: 
      # "radio_list" "var_to_change" 
     self.root_window.mainloop() 

def radio_example(): 
    radio = change_var_window(300, 350, "Radio Select") 
    radio.change_var_window_values.update({"free_form": False, "toggle": False, "radio": True, "var_to_change": "w_audiocodec", "line_one": "Current value of w_audiocodec:", "line_two": vars_system.init_vars["w_audiocodec"]}) 
    radio.change_var_window_values.update({"radio_list": [("Windows Media Audio 9.2", "Windows Media Audio 9.2"), ("Windows Media Audio 9.2 Lossless", "Windows Media Audio 9.2 Lossless"), ("Windows Media Audio 10 Professional", "Windows Media Audio 10 Professional")]}) 
    #main_window.root_window.withdraw() 
    radio.create_change_var_window() 

vars_system = init_system() 

main_window = render_window(200, 250, "Main Window") 
main_window.new_button("Radio Var", radio_example) 

main_window.root_window.mainloop() 

+0

참고 : PEP8을 따랐다면 코드가 훨씬 이해하기 쉬울 것입니다. 특히 클래스 이름은 대문자로 시작해야합니다. –

+0

좋습니다.이 코드를 마치면이 점을 명심하십시오. 내가 주 프로그램으로 밀어 넣으면 pep8을 더 가깝게 따라갈 것이다. –

답변

1

문제는 하나 개 이상의 루트 창을 생성한다는 사실과 관련이 :-)이 문제를보고 시간을내어 주셔서 감사합니다. 프로그램 수명 동안 정확히 Tk의 인스턴스를 하나 만들도록 코드를 변경해야합니다. 한 루트의 위젯과 변수는 다른 루트 윈도우의 위젯과 변수와 공유 할 수 없습니다.

하나 이상의 창이 필요하면 루트 창을 제외하고 모두 Toplevel의 인스턴스 여야합니다.

+0

편집중인 변수가 다른 클래스 인스턴스에 있더라도? 나는 이것을 시험해야 할 것이다. 감사! –

+0

@ElliotLabs : 예. 각 루트 창을 별도의 프로세스로 생각해야합니다. 그것은 사실 그대로는 아니지만 개념적으로는 상당히 정확합니다. 각각의 루트 윈도우는 자체의 네임 스페이스를 가진 독립적 인 Tcl 인터프리터로 들어갑니다. –