python-3.x 如何从自定义表单中检索tkinter中的条目值

jv4diomz  于 2023-02-20  发布在  Python
关注(0)|答案(1)|浏览(158)

编写了一个自定义框架类,这样我就可以轻松地生成标签,条目等。我可以输入标签的数量,我希望每个表单都有一些条目。通过创建类的不同示例,我不需要每次都写很多标签和条目。但是当我运行代码时,什么也没发生。我没有得到任何错误来引导我。如果我在get_first_entry中放置一个print语句(self)函数,然后它打印入口的值,但我想从类外部访问该值。

import tkinter as tk

class MyFrame(tk.Frame):
    def __init__(self, parent, num_labels, num_entries, num_buttons, label_names=None, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        
        # If label names are provided, use them instead of default labels
        if label_names is None:
            label_names = [f"Label {i+1}" for i in range(num_labels)]
        
        # Create labels and entries
        self.entries = []
        
        
        for i in range(num_labels):
            label = tk.Label(self, text=label_names[i])
            label.grid(row=i, column=0)
        
        
        for i in range(num_entries):
            entry = tk.Entry(self)
            entry.grid(row=i, column=1)
            self.entries.append(entry)
        
        # Create buttons

        for i in range(num_buttons):
            if i == 0:
                button = tk.Button(self, text=f"Get RA", command=self.get_first_entry)
            elif i == 1:
                button = tk.Button(self, text=f"Get DEC", command=self.get_second_entry)
            #else:
                #button = tk.Button(self, text=f"Button {i+1}")
            button.grid(row=num_labels+i, column=0, columnspan=2, pady=2)
    
    def get_first_entry(self):
        value = self.entries[0].get()
        return value
       
        
    def get_second_entry(self):
        value = self.entries[1].get()
        return value


root = tk.Tk()
label_RADEC = ['RA','DEC']
label_Time = ['LST','local time']
# Create first frame
frame1 = MyFrame(root, num_labels=2, num_entries=2, num_buttons=2, label_names=label_RADEC)
frame1.grid(row=0, column=0, padx=10, pady=10)

# Access the first entry
first_entry_value = frame1.get_first_entry()

print(first_entry_value)

root.mainloop()

更新了所有条目作为数组的方法。现在它在开始时打印空数组,但是如果我在条目中输入其他值,仍然不打印任何东西

'',''
vulvrdjw

vulvrdjw1#

问题不在于get_entries不起作用,而在于您使用它的方式不对。
当您第一次调用get_entries并打印结果时,在用户有机会输入任何内容之前,它会打印一个空字符串列表。
当你按下按钮调用get_entries时,它会很好地计算值,但是,因为它只返回值,调用者(mainloop)忽略了它调用的所有函数的返回值,因为它不知道如何处理它们,所以这些值会被丢弃。
你可以在get_entries中添加一个print语句,当你这样做的时候,你可以看到它得到的值很好:

def get_entries(self):
    result = [entry.get() for entry in self.entries]
    print(f"get_entries result: {result}")
    return result

当我在第一个条目中插入“this is RA”,在第二个条目中插入“this is DEC”时,当我按下按钮时,我得到以下输出:

get_entries result: ['this is RA', 'this is DEC']

如果将return语句保留在中,则可以使用它从类外部获取值,只是必须在用户输入值之后而不是之前执行此操作。

相关问题