Tkinter:create_window()和框架未正确显示

时间:2013-09-18 14:55:54

标签: python user-interface python-2.7 tkinter

我正在使用Python和Tkinter开展一个小项目。我需要展示一张包含挖掘机/挖掘机所有功能的桌子。

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

问题是我无法正确显示表格;我只能得到它的垂直部分:

enter image description here

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

我找到解决问题的唯一方法是使用固定宽度...但它并不好。 有什么建议吗?

编辑:

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

enter image description here

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

问题是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()

这是 table 模块的代码:

#!/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

1 个答案:

答案 0 :(得分:2)

尝试在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)

说明:

Tkinter grid几何管理器对窗口小部件中的每个列和行都有一个“权重”。列/行的权重决定了列或行占用的小部件分配空间的大小。

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

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

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

来自NMT的columnconfigurerowconfigure函数的

Here is some documentation。兴趣点:columnconfigurerowconfigure实际上是grid_columnconfiguregrid_rowconfigure的别名,我认为这样可以节省5次击键。

注意:

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