1

我正在用 Python 和 Tkinter 做一个小项目。我需要展示一张包含一些挖掘机/挖掘机的所有功能的表格。

桌子基本上是一个大框架,里面有很多标签对象。我将此框架放在 Canvas 对象中(使用create_window()),该对象位于另一个框架内(与滚动条一起)

问题是我无法正确地可视化表格;我只能得到它的垂直部分:

在此处输入图像描述

绿色部分是包含 Canvas 对象和滚动条的框架

我发现解决问题的唯一方法是使用固定宽度……但这不是很好。有什么建议么?

编辑:

我希望桌子有一个固定的高度(这是有效的),你可以在这里看到:

在此处输入图像描述

红色部分是画布对象,包含表格,绿色部分是框架,包含画布和滚动条。我删除了滚动条,以便更容易看到发生了什么。

问题是画布对象没有展开(参见前面的截图,我不知道为什么。我想要的是画布的宽度跟随桌子的宽度。

代码在这里:

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

import Tkinter, string, table
from functions import *

bg_color = "#d3d3d3"
first_table = True

# MODEL: Functions to handle the main processing of the program in
# response to user interaction
def create_tables():
    global tab, first_table, tab_space, mbtext
    select = choice.get()
    choices = [ 1, 2, 3, 4, 5]
    mbtext.set( str( choices[select])) # resetting the number in the menubutton
    if not first_table:
        # cleaning the canvas
        t.destroy()
        comp_space.destroy()
    # space to display the objects
    master = Tkinter.Frame( top, bg = 'green')
    master.grid( row = 2, column = 0, sticky = "wesn", padx = 10  )

    # space for the table:
    tab_space = Tkinter.Canvas( master, bg = 'red', highlightthickness = 0, height = 600, scrollregion=(0, 0, 2000, 780))
    tab_space.grid( row = 0, column = 0)

    # creating the table...
    tab = table.CompTable( tab_space, columns = choices[select]+1 )
    tab.first_set()
    tab_space.create_window(0, 0, anchor = "nw", window = tab)

    # and the scrollbar:
    scrollY = Tkinter.Scrollbar ( master, bg = bg_color, bd = 4, activebackground = bg_color, orient = "vertical")
    scrollY.grid( row = 0, column = 1, sticky = "nswe")

    #binding canvas and scrollbar together
    scrollY.configure( command = tab_space.yview)
    tab_space.configure(yscrollcommand = scrollY.set )

# VIEW: Setup the widgets

# The main window
top = Tkinter.Tk()
top.configure( bg = bg_color)
top.title("Comparatore")

# logo_frame/canvas - using a Canvas object to load images
logo_canvas = Tkinter.Canvas( top,  bg = bg_color, highlightthickness = 0, height = 58, width = 590 )
logo_canvas.grid( row = 0, column = 0, ipadx = 0, ipady=0, sticky = "nw")
logo = Tkinter.PhotoImage(file = "Images/Logo.gif")
logo_canvas.create_image(0, 0, image = logo, anchor="nw")

# background
bg_label = Tkinter.Label( top, bg = bg_color )
bg_label.grid( row = 1, column = 0, sticky = "nesw")

# menu to handle how many items we are using
select_text = Tkinter.Label( bg_label, text = " Selezionare il numero di macchine da confrontare: ", 
        font = ("verdana", 16), bg = bg_color)
select_text.grid( row = 0, column = 0, sticky = "nsew")

mbtext = Tkinter.StringVar()
mbtext.set("")
how_many_mb = Tkinter.Menubutton( bg_label, textvariable = mbtext, relief= "raised", bg = bg_color)
how_many_mb.menu = Tkinter.Menu( how_many_mb, tearoff = 0)
how_many_mb["menu"] = how_many_mb.menu
how_many_mb.grid( row = 0, column = 1, sticky = "nsew", padx = 4, ipadx = 18)

# CONTROLLER
choice = Tkinter.IntVar()
how_many_mb.menu.add_radiobutton( label = "1", variable = choice, value = 0, command = create_tables)
how_many_mb.menu.add_radiobutton( label = "2", variable = choice, value = 1, command = create_tables)
how_many_mb.menu.add_radiobutton( label = "3", variable = choice, value = 2, command = create_tables)
how_many_mb.menu.add_radiobutton( label = "4", variable = choice, value = 3, command = create_tables)
how_many_mb.menu.add_radiobutton( label = "5", variable = choice, value = 4, command = create_tables)


##
Tkinter.mainloop()

这是表格模块的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

import Tkinter as tk

mbtext1 = tk.StringVar()
mbtext1.set("-Selezionare-")


details = ["Costruttore", "Modello", "Capacità Benna", "Carico rib. art.", "Peso", "Potenza",
                "Motore (Marca)", "Cilindrata", "Cilindri", "Alesaggio per corsa", "Regime di taratura",
                "Alimentazione aria", "Pompe", "Portata", "Pressione", "Trasmissione", "Marce",
                "Velocità traslazione", "Velocità di rotazione", "Differenziali", "Freni", "Pneumatici", "Passo", "Carreggiata",
                "Articolazione", " Raggio sterzo alla benna ", "Cinematismo benna", "Max altezza perno b.",
                "Forza di strappo", "Forza di penetrazione", "Sbalzo posteriore torretta", "Lama", "Larghezza benna", 
                "Larghezza max", "Altezza trasporto", "Larghezza cingoli", "Larghezza torretta",
                "Larghezza esterna pneumatici", "Lunghezza trasporto"]

class CompTable(tk.Frame):
    global details

    def __init__(self, parent, rows=len(details), columns=2):
        # using black background
        tk.Frame.__init__(self, parent, background="black")
        self._widgets = []
        for row in range(rows):
            current_row = []
            for column in range(columns):
                if row in [ 0, 1] and column != 0:
                    menu = tk.Menubutton(self, textvariable = mbtext1, width = 15)
                    menu.grid( row=row, column=column, sticky="nsew", padx=1, pady=1 )
                    current_row.append(menu)
                else:
                    label = tk.Label(self, background = "#fcfcfc", text="                           ", 
                                     borderwidth=0)
                    label.grid( row=row, column=column, sticky="nsew", padx=1, pady=1)
                    current_row.append(label)
            self._widgets.append(current_row)

    def set(self, row, column, value):
        widget = self._widgets[row][column]
        widget.configure(text=value)

    def first_set( self ):
        actual_detail = 0
        for element in details:
            self.set(actual_detail, 0, element)
            actual_detail += 1
4

1 回答 1

3

尝试将其添加到您的表中,然后立即创建代码tab_space.grid( row = 0, column = 0)

master.columnconfigure(0, weight=1)

编辑

好的,这或多或少地解决了上述问题:

如果你更换

tab_space.grid( row = 0, column = 0)

tab_space.grid( row = 0, column = 0, sticky="nsew")
top.columnconfigure(0, weight=1)
master.columnconfigure(0, weight=1)

解释:

Tkintergrid几何管理器对小部件中的每一列和每一行都有一个“权重”。列/行的权重决定了该列或行占用了多少小部件的分配空间。

您可以更改给定列/行的权重。例如,如果您有一个名为 的框架frame,则将小部件frame.columnconfigure(3, weight=7)的第 3 列的权重设置frame为 7。有一个相应的函数称为rowconfigure

默认权重为 0,这意味着列/行不会随着或多或少的空间变得可用或需要而增长或缩小 - 它们是静态的。如果第 0 列的权重为 2,第 1 列的权重为 3,并且有 5 个额外像素可用,则第 0 列扩展 2 个像素,第 1 列扩展 3 个像素。

如果你只有一列,最后一点是无关紧要的,但这个问题的重要部分是包含表格画布的列(以及包含主框架的列)具有非零权重,因此网格几何管理器知道允许它完全扩展或收缩,而不是保持最初分配的任何宽度。

这是NMT中有关columnconfigure和函数的一些文档。rowconfigure兴趣点:columnconfigureandrowconfigure实际上是 and 的别名grid_columnconfiguregrid_rowconfigure我假设已实现以节省 5 次击键。

笔记:

您应该能够通过手动调整窗口大小来查看表格的其余部分。我认为您将不得不使用该<Configure>事件做一些工作以使窗口自动调整为正确的宽度。

于 2013-09-22T02:31:35.087 回答