Python Tkinter:为什么我的 if...elif 语句不适用于 StringVar()?

时间:2021-07-08 01:55:19

标签: python-3.x if-statement tkinter spyder

我知道这段代码需要改进,但首先我不明白为什么 sample_choice a tk.StringVar() 似乎没有传递给我的 if...elif 块。我试图对代码做的是根据组合框中的选择显示某些标签,该组合框中将其当前状态保存在 sample_choice 中。似乎在第一次执行此函数后,程序永远不会循环回该函数,即使它在主循环中被调用,并且永远不会到达 if...elif 块以对 Combobox 中新选择的值执行操作.我想我在这里遗漏了一些非常基本的东西。如果需要更多信息,请告诉我,我将上传此功能所属的课程。提前致谢!

def pin_interface(self):
    
        path = "Images\\Sample.png"
        sample_choice = tk.StringVar()
        samples = ("Sample A", "Sample B")
        pin_index = ("A1:", "A2:", "A3:", "A4:","B1:", "B2:", "B3:", "B4:")
 

        sample_img = ImageTk.PhotoImage(file = path)
        img_label = ttk.Label(self.settings_subframe_2_1, image = sample_img)          
        img_label.image = sample_img
        img_label.grid(row = 0 , column = 0)
        
        
        label_1 = ttk.Label(self.settings_subframe_2_1, text = "Select a Sample:")
        label_1.grid(row = 1, column = 0)
        
        option_1 = ttk.Combobox(self.settings_subframe_2_1, textvariable = sample_choice, values = samples, width = len(samples[0])+1)
        option_1.grid(row = 2, column = 0)
           
        pin_label_a1 = ttk.Label(self.settings_subframe_2_1, text = pin_index[0])
        pin_label_a2 = ttk.Label(self.settings_subframe_2_1, text = pin_index[1])
        pin_label_a3 = ttk.Label(self.settings_subframe_2_1, text = pin_index[2])
        pin_label_a4 = ttk.Label(self.settings_subframe_2_1, text = pin_index[3])
        
        pin_label_b1 = ttk.Label(self.settings_subframe_2_1, text = pin_index[4])
        pin_label_b2 = ttk.Label(self.settings_subframe_2_1, text = pin_index[5])
        pin_label_b3 = ttk.Label(self.settings_subframe_2_1, text = pin_index[6])
        pin_label_b4 = ttk.Label(self.settings_subframe_2_1, text = pin_index[7])
    
        
    
        if sample_choice.get() == samples[0]:
        

                pin_label_b1.grid_forget()
                
                pin_label_b2.grid_forget()
        
                pin_label_b3.grid_forget()
        
                pin_label_b4.grid_forget()
                    
                    
                pin_label_a1.grid(row = 3 , column = 0, sticky = "W")
                
                pin_label_a2.grid(row = 4 , column = 0, sticky = "W")
        
                pin_label_a3.grid(row = 3 , column = 1, sticky = "W")
        
                pin_label_a4.grid(row = 4 , column = 1, sticky = "W")
        
        
        elif sample_choice.get() == samples[1]:
                    
                pin_label_a1.grid_forget()
                
                pin_label_a2.grid_forget()
        
                pin_label_a3.grid_forget()
        
                pin_label_a4.grid_forget()
                
            
                pin_label_b1.grid(row = 3 , column = 0)
                
                pin_label_b2.grid(row = 4 , column = 0)
        
                pin_label_b3.grid(row = 3 , column = 1)
        
                pin_label_b4.grid(row = 4 , column = 1)

1 个答案:

答案 0 :(得分:0)

代码不起作用,因为您在窗口显示之前检查了选择。您应该在用户更改 Combobox 的值后检查选择。

为此,您最好将组合框中的更改事件绑定到检查值并采取行动的函数。我建议将 StringVar 作为 tkinter 小部件的属性,以便可以从所有方法访问它:

[...]
self. sample_choice = tk.StringVar() ## Make it an attribute of self

[...]
option_1 = ttk.Combobox(self.settings_subframe_2_1, textvariable = self.sample_choice, values = samples, width = len(samples[0])+1)
option_1.grid(row = 2, column = 0)
option_1 .bind("<<ComboboxSelected>>", self.check_value)

然后,您只需要将完整的 if 块移动到名为 .check_value() 的新 self 方法中:

def check_value(self):
    if self.sample_choice.get() == samples[0]:
         pin_label_b1.grid_forget()
         pin_label_b2.grid_forget()
    [...]

现在每当您更改组合框的选择时都会执行此方法。