2016-05-03 4 views
1

Ich habe geschrieben und Anwendung Frontend mit Tkinter, die ein Layout des Seiten-Managers verwendet und würde es mit einem Grid-System statt Pack legen. Ich konnte die Scrollbar-Funktion nicht mit dem Grid-Layout arbeiten, also habe ich es mit dem Pack eingerichtet. Dies funktioniert im Allgemeinen, aber das Layout, das ich möchte, wird ein Raster (oder eine Reihe von zusätzlichen Frames bei der Verwendung von Pack) benötigen.Scrollbar und Größenanpassung funktioniert nicht mit Tkinter Grid-Array und Treeview

Kann jemand einen Blick darauf werfen, was ich nicht bekomme? Ich habe Code mit dem Pack-System eingefügt, das etwas nah an dem gibt, was ich mit Gitter erreichen möchte. Die entsprechenden Grid-Befehle, von denen ich dachte, dass sie funktionieren, sind auskommentiert.

Ich nahm auch die Seitenverwaltung in der Hauptklasse und reduzierte es auf eine Seite, um die Probleme klarer zu machen. Ich möchte auf lange Sicht das Seitenmanagement behalten ...

Danke fürs schauen!

import tkinter as tk 
from tkinter import ttk 
import tkinter.font as tkFont 

colHeadings = ['car', 'repair'] 
itemList = [('Hyundai', 'brakes'),('Honda', 'light'), 
      ('Lexus', 'battery'), ('Benz', 'wiper'), 
      ('Ford', 'tire'), ('Chevy', 'air'), 
      ('Chrysler', 'piston'), ('Toyota', 'brake pedal'), 
      ('BMW', 'seat')] 

def buildtree(thetree, colHeadings, itemList): 
    thetree['columns'] = colHeadings 
    for each in colHeadings: 
     thetree.column(each, width=tkFont.Font().measure(each.title())) 
     thetree.heading(each, text=each.title()) 
    for item in itemList: 
     thetree.insert('', 'end', values=item) 
     for i, each in enumerate(item): 
      colwidth = int(1.3*tkFont.Font().measure(each)) 
      if thetree.column(colHeadings[i], width=None) < colwidth: 
       thetree.column(colHeadings[i], width=colwidth) 

class AppBT(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     container = ttk.Frame(self) 
     frame = StatsTree(container) 

     container.pack(side="top", fill="both", expand=1) 
     frame.pack(side="top", fill="y",expand=1) 
     # container.grid(row=0, column=0, sticky="nsew") 
     # container.grid_rowconfigure(0, weight=1) 
     # container.grid_columnconfigure(0, weight=1) 
     # frame.grid(row=0, column=0, sticky="ns") 


class StatsTree(ttk.Frame): 
    def __init__(self, parent): 
     ttk.Frame.__init__(self, parent) 

     tframe = ttk.Frame(self) 
     yscrollbar = ttk.Scrollbar(tframe, orient="vertical") 
     tree = ttk.Treeview(tframe) 

     yscrollbar.config(command=tree.yview) 
     tree.config(yscrollcommand=yscrollbar.set) 

     buildtree(tree, colHeadings, itemList) 

     tree.pack(side="left", fill="y") 
     yscrollbar.pack(side="right", fill="y") 
     tframe.pack(side="top", fill="y", expand=1, padx=10, pady=10) 

     # tframe.grid(row=0, column=0, sticky="ns", padx=10, pady=10) 
     # tframe.grid_rowconfigure(0, weight=1) 
     # tframe.grid_columnconfigure(0, weight=1) 
     # tree.grid(row=0, column=0, sticky="ns") 
     # tree.grid_rowconfigure(0, weight=1) 
     # tree.grid_columnconfigure(0, weight=1) 
     # yscrollbar.grid(row=0, column=1, sticky="ns") 
     # yscrollbar.grid_rowconfigure(0, weight=1) 
     # yscrollbar.grid_columnconfigure(1, weight=1) 


app = AppBT() 
app.geometry("800x600") 
app.mainloop() 

Antwort

0

Zunächst einmal ist nichts daran falsch, wie die Bildlaufleisten arbeiten. Wenn Sie das Fenster so verkleinern können, dass einige der Objekte verdeckt sind, funktionieren die Bildlaufleisten wie erwartet. Es gibt nichts, was Sie tun müssen, um das Verhalten der Bildlaufleiste zu beheben.

Als allgemeine Faustregel gilt: Wenn Sie Widgets unter Verwendung von grid in ein anderes Widget platzieren, müssen Sie mindestens eine Zeile und eine Spalte des übergeordneten Widgets mit einem positiven Gewicht versehen. Du vergisst das an zwei Stellen.

Das erste Problem ist, dass Sie grid verwenden container im Root-Fenster zu platzieren, aber Sie haben kein Gewicht auf die Zeilen und Spalten im Hauptfenster gegeben. Daher wird container nicht erweitert, um das Fenster als Ganzes zu füllen, so dass sich auch nichts in container erweitern kann.

Da dies das einzige Widget im Root-Fenster ist, ist es meiner Meinung nach ein wenig einfacher, pack zu verwenden. Da Sie Raster verwenden möchten, müssen Sie folgende in AppBT.__init__ hinzuzufügen:

self.grid_rowconfigure(0, weight=1) 
self.grid_columnconfigure(0, weight=1) 

Sie das gleiche Problem mit StatsTree wiederholen - Sie grid verwenden tframe in diesem Rahmen zu setzen, aber Sie konfigurieren, nicht das Gewicht von die Zeilen und Spalten in StatsTree. Das verhindert, dass tframe erweitert wird, was verhindert, dass sich die Struktur und die Bildlaufleiste ausdehnen.

Sie müssen Folgendes StatsTree.__init__ hinzufügen, wenn Sie Raster für die Kind-Widgets in StatsTree

self.grid_rowconfigure(0, weight=1) 
self.grid_columnconfigure(0, weight=1 
nutzen möchten
Verwandte Themen