【问题标题】:Issues accessing Tkinter Radio Button CTRL var访问 Tkinter 单选按钮 CTRL var 的问题
【发布时间】:2017-02-09 04:04:39
【问题描述】:

我无法获取所选单选按钮的值。目前,当我在单选按钮使用的变量上使用 .get() 函数时,它不会返回 "" 。如果我使用没有.get() 函数的消息框,那么它会返回PY_VARx,其中x 是tkinter 变量的特定实例。

单选按钮正在正确使用该变量,从您一次只能选择一个单选按钮这一事实可以看出,但我无法正确读取该值。我想读取当前选择并将其放入不同的变量中。

以下是删节代码(您只看到程序的单选按钮部分)。

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()

感谢您抽出宝贵时间查看此问题 :-)

【问题讨论】:

  • 注意:如果您遵循 PEP8,您的代码会非常更容易理解。具体来说,您的类名应以大写字符开头。
  • 好的,当我完成这段代码时,我会记住这一点。当我将它推送到主程序时,我将更新以更密切地关注 pep8。

标签: python python-3.x variables tkinter radio-button


【解决方案1】:

问题与您创建多个根窗口有关。您需要更改您的代码,以便在程序的整个生命周期中只创建一个 Tk 实例。一个根窗口中的小部件和变量不能与另一个根窗口中的小部件和变量共享。

如果您需要多个窗口,则除根窗口之外的所有窗口都必须是Toplevel 的实例。

【讨论】:

  • 即使正在编辑的变量在不同的类实例中?我得试试这个。谢谢!
  • @ElliotLabs:是的。您必须将每个根窗口视为处于单独的进程中。这不是字面上的真实,但从概念上讲它是相当准确的。每个根窗口都进入具有自己命名空间的独立 Tcl 解释器。
猜你喜欢
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 2017-12-07
  • 2015-12-25
  • 2014-05-10
相关资源
最近更新 更多