首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在sheet_display_dimensions中使用tkinter / tksheet构建一个固定大小的数据表

在sheet_display_dimensions中使用tkinter / tksheet构建一个固定大小的数据表
EN

Stack Overflow用户
提问于 2021-11-17 09:14:48
回答 1查看 615关注 0票数 0

我正在构建一个用户界面,使用用户指定大小的几个表格(类似电子表格)(但一旦初始化后大小不会改变)。用户可以通过复制粘贴数据(通常来自excel)或直接向单元格键入数据来填充这些表。我正在使用Tksheet Tkinter附加功能。Tksheet中似乎有几个选项可以实现打开I行和j列的空表的目标:

a) set_sheet_data_and_display_dimensions(total_rows = None, total_columns = None)

这个例程抛出一个TypeError。错误出现在:GetLinesHeight(self, n, old_method = False)中,子例程期望参数n为整数,但接收一个元组。调用例程是sheet_display_dimensions,相关行是:height = self.MT.GetLinesHeight(self.MT.default_rh)

MT.default_rh显然是一个复杂的对象,它可以是整数,也可以是字符串或元组。在Tksheet中使用它的其他例程执行精细的操作,以确保它以整数形式传递给子例程,但不是sheet_display_dimensions

( b) sheet_data_dimensions(total_rows = None, total_columns = None)

这似乎以编程方式工作,但不向用户显示表。可以添加行sheet_display_dimensions(i,j),但是--您猜到了--这会引起错误.

样本代码:

代码语言:javascript
运行
复制
from tksheet import Sheet
import tkinter as tk
from tkinter import ttk

# This class builds and displays a test table. It is not part of the question but merely used to illustrate it
class SeriesTable(tk.Frame):
    def __init__(self, master):
        super().__init__(master)  # call super class init to build frame
        self.grid_columnconfigure(0, weight=1)  # This configures the window's escalators
        self.grid_rowconfigure(0, weight=1)
        self.grid(row=0, column=0, sticky="nswe")
        self.sheet = Sheet(self, data=[[]])  # set up empty table inside the frame
        self.sheet.grid(row=0, column=0, sticky="nswe")
        self.sheet.enable_bindings(bindings=  # enable table behavior
                                   ("single_select",
                                    "select_all",
                                    "column_select",
                                    "row_select",
                                    "drag_select",
                                    "arrowkeys",
                                    "column_width_resize",
                                    "double_click_column_resize",
                                    "row_height_resize",
                                    "double_click_row_resize",
                                    "right_click_popup_menu",
                                    "rc_select",  # rc = right click
                                    "copy",
                                    "cut",
                                    "paste",
                                    "delete",
                                    "undo",
                                    "edit_cell"
                                    ))
        # Note that options that change the structure/size of the table (e.g. insert/delete col/row) are disabled

        # make sure that pasting data won't change table size
        self.sheet.set_options(expand_sheet_if_paste_too_big=False)
        # bind specific events to my own functions
        self.sheet.extra_bindings("end_edit_cell", func=self.cell_edited)
        self.sheet.extra_bindings("end_paste", func=self.cells_pasted)
        label = "Change column name"  # Add option to the right-click menu for column headers
        self.sheet.popup_menu_add_command(label, self.column_header_change, table_menu=False, index_menu=False, header_menu=True)

    # Event functions
    def cell_edited(self, info_tuple):
        r, c, key_pressed, updated_value = info_tuple  # break the info about the event to individual variables
        '''
        updated_value checked here
        '''
        # passed tests
        pass  # go do stuff

    def cells_pasted(self, info_tuple):
        key_pressed, rc_tuple, updated_array = info_tuple  # break the info about the event to individual variables
        r, c = rc_tuple  # row & column where paste begins
        err_flag = False  # will be switched if errors are encountered
        '''
        updated_array is checked here
        '''
        # passed tests
        if err_flag:  # error during checks is indicated
            self.sheet.undo()  # undo change
        else:
            pass  # go do stuff

    def column_header_change(self):
        r, c = self.sheet.get_currently_selected()
        col_name = sd.askstring("User Input", "Enter column name:")
        if col_name is not None and col_name != "":  # if user cancelled (or didn't enter anything), do nothing
            self.sheet.headers([col_name], index=c)  # This does not work - it always changes the 1st col
            self.sheet.redraw()


# from here down is test code
tk_win = tk.Tk()  # establish the root tkinter window
tk_win.title("Master Sequence")
tk_win.geometry("600x400")
tk_win.config(bg='red')
nb = ttk.Notebook(tk_win)  # a notebook in ttk is a [horizontal] list of tabs, each associated with a page
nb.pack(expand=True, fill='both')  # widget packing strategy
settings_page = tk.Frame(nb)  # initiate 1st tab object in the notebook
nb.add(settings_page, text = "Settings")  # add it as top page in the notebook
test = SeriesTable(nb)  # creates a 1 row X 0 column table
nb.add(test, text = "Table Test")  # add it as second page in the notebook
i = 4
j = 3
#test.sheet.set_sheet_data_and_display_dimensions(total_rows=i, total_columns=j)  # raises TypeError
#test.sheet.sheet_data_dimensions(total_rows=i, total_columns=j)  # extends the table to 4 X 3, but the display is still 1 X 0
#test.sheet.sheet_display_dimensions(total_rows=i, total_columns=j)   # raises TypeError
test.sheet.insert_columns(j)  # this works
test.sheet.insert_rows(i - 1)  # note that we insert i-1 because table already has one row
test.mainloop()
EN

回答 1

Stack Overflow用户

发布于 2021-11-17 09:14:48

我想出了一个解决办法: c)

代码语言:javascript
运行
复制
insert_columns(j)
insert_rows(i - 1)  

请注意,您必须插入i-1行。这是因为工作表对象由1行和0列发起。(但文件中有这样的说法吗?)不,不.)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70001624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档