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

Python Tkinter: Why is my if...elif statement not working with a StringVar()?

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

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)

该代码不起作用,因为您甚至在显示 window 之前检查了选择。您应该在用户更改组合框的值后检查选择。

为此,您最好将组合框中的更改事件绑定到一个检查值并采取行动的函数。我建议让 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()
    [...]

现在只要您更改组合框的选择,就会执行此方法。