python - Tkinter 如何在不使用字典的情况下制作动态选项菜单

标签 python dynamic tkinter optionmenu

我找到了this question ,这对了解方法很有帮助,但我想使用他们的方法而不使用字典。

基本上,在 Python 中,我尝试使用 Tkinter 中的两个选项菜单,其中第一个将包含 Excel 文档的选项卡,然后第二个将包含选项卡包含后我从其中一列中读取的信息。从第一个选项菜单中选择。由于我不想事先存储和读取每个选项卡,因此在选择选项卡后调用函数来读取数据似乎比事先创建字典要高效得多。有人知道这样做的方法吗?

这是我到目前为止所拥有的(excel_transfer 是一个基于 openpyxl 的自行创建的库 - 如果您对我正在做的事情有进一步的疑问,请随时询问,否则似乎没有必要深入了解它)这个问题的目的):

import Tkinter
from Tkinter import *
from ttk import Frame
import manipulate_excel
import openpyxl
from openpyxl import load_workbook

class GUI(Frame):
    def read_tabs(self):
        wkbk = load_workbook('file.xlsx')
        sheets=wkbk.get_sheet_names()
        return sheets
    def read_columns(self):
        sheet = self.tabs_var.get()
        #if no value is selected, keep return a blank value
        if(sheet == ''):
            return ['']
        else:
            filepath = 'file.xlsx'
            workbook = excel_transfer.workbook(filepath)
            wb = workbook.open_existing_workbook()
            ws = wb(sheet)
            #step through the rows until a blank value is read
            row = 1
            current_row = 0
            previous_row = 0
            values = []
            #read the column, and append values to the array
            while current_row != None:
                previous_row = current_row
                row = row + 1
                cell = 'A' + str(row)
                current_row = workbook.read_new_cell(cell, ws)
                if(current_row != None):
                    values.append(current_row)
            #if there are no values, still return a single array value so it doesn't barf
            if(values== []):
                values= ['']
            return values

    def build_gui(self):
        n = Notebook(self)
        tab = Tkinter.LabelFrame(self, text='Tab')
        n.add(tab, text='Tab')
        n.pack()
        self.tabsvar = StringVar()
        self.tabsvar.set('')
        self.valuesvar = StringVar()
        self.valuesvar.set('')
        self.list_of_tabs = self.read_tabs()
        self.list_of_values = self.read_columns()
        self.TAB_OPTION = OptionMenu(tab, self.tabsvar, *self.list_of_tabs)
        self.TAB_OPTION.grid(row=0, column=0)
        self.VALUES_OPTION = OptionMenu(tab, self.valuesvar, *self.list_of_values)
        self.VALUES_OPTION.grid(row=1, column=0)

if __name__ == '__main__':
    root = Tk()
    app = GUI(root)
    root.mainloop()

第一个选项可以查找选项卡,但我遇到的问题是 read_column 仅在 GUI 最初打开时发生,它仍然是空白值。我如何使 self.list_of_values 响应第一个选项菜单中选择的选项卡?我可以在没有字典的情况下使用trace吗?我确信有更漂亮的方法来编写我所做的代码 - 我愿意接受建设性的批评,因为总是有很多东西需要学习。谢谢您的帮助!

最佳答案

好的,所以我在继续使用它后找到了答案,以帮助将来遇到同样问题的人。 我将 self.TAB_OPTION 更改为:

self.TAB_OPTION(tab, self.tabsvar, *self.list_of_tabs, command=self.read_columns)

通过添加此命令,我必须将变量传递到 self.read_columns 中,因为添加命令会自动传递用户在第一个选项菜单中选择的值。所以,我将 self.read_columns 更改为:

def read_columns(self, board):
    sheet = board
    #sheet = self.tabs_var.get()

我还取出了上面显示的注释行,因此它接收了在 TAB_OPTION 的第一个选项菜单中选择的值,而不是读取从 GUI 中选择的值。我还添加了:

self.VALUES_OPTION['menu'].delete(0, 'end')
for item in values:
    self.VALUES_OPTION['menu'].add_command(label=item)

在 read_columns 函数的末尾,这样它将重新生成第二个选项菜单的值。它删除所有以前的值,然后添加通过迭代数组从 Excel 中读取的每个值。我不再需要函数末尾的返回值。 我希望这可以帮助其他困惑的程序员:)

关于python - Tkinter 如何在不使用字典的情况下制作动态选项菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25898211/

相关文章:

database - 支持动态属性的架构

javascript - 为什么我不能向我的 HTML 表格中动态添加行?

python - 如何将Python代码附加到exe文件

python - 带有标题栏和 Windows 任务栏的 Tkinter 窗口

python - 在 python 中只保留 int

python - Django 模板 - 新变量声明

python - 碰撞Pygame后穿过墙壁

python - 复制由 pandas.DataFrame 组成的复合对象时出错

c - 如何防止动态重定位(rela.dyn)?

python - 当窗口大小调整时,如何调整放置的 tkinter 小部件的大小?