1

Python と Tkinter を使用した小さなプロジェクトに取り組んでいます。一部の掘削機/掘削機のすべての機能を備えたテーブルを表示する必要があります。

テーブルは基本的に、内部に多数のラベル オブジェクトを含む大きなフレームです。create_window()このフレームを、別のフレーム(スクロールバーと一緒に)内にある Canvas オブジェクト ( を使用) 内に配置しています。

問題は、テーブルを正しく視覚化できないことです。私はそれの垂直部分しか取得できません:

ここに画像の説明を入力

緑色の部分は 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ジオメトリ マネージャーには、ウィジェット内のすべての列と行の「重み」があります。列/行の重みによって、その列または行が占めるウィジェットの割り当てスペースの量が決まります。

特定の列/行の重みを変更できます。たとえば、 というフレームがある場合、ウィジェットの列 3 の重みを 7 に設定frameします。 という対応する関数があります。frame.columnconfigure(3, weight=7)framerowconfigure

デフォルトの重みは 0 です。これは、使用可能または必要なスペースが増減しても、列/行が拡大または縮小しないことを意味します。それらは静的です。列 0 の重みが 2 で、列 1 の重みが 3 の場合、追加の 5 ピクセルが使用可能になると、列 0 は 2 ピクセル拡大し、列 1 は 3 ピクセル拡大します。

列が 1 つしかない場合、最後のビットは関係ありませんが、この問題の重要な部分は、テーブル キャンバスを含む列 (およびマスター フレームを含む列) の重みがゼロでないことです。したがって、グリッド ジオメトリ マネージャーはそれを認識します。最初に割り当てられた幅を維持するのではなく、拡張または縮小できるようにします。

NMTのcolumnconfigureおよび関数に関するドキュメントを次に示します。rowconfigure興味深い点: columnconfigureandrowconfigureは実際には and のエイリアスでgrid_columnconfigureありgrid_rowconfigure、5 つのキーストロークを節約するために実装されていると思います。

ノート:

ウィンドウのサイズを手動で変更すると、テーブルの残りの部分を表示できるはずです。<Configure>ウィンドウを正しい幅に自動的にサイズ変更するには、イベントを使用して何らかの作業を行う必要があると思います。

于 2013-09-22T02:31:35.087 に答える