簡體   English   中英

Python-將包含tkinter小部件的框架傳遞給類

[英]Python - Passing a frame containing tkinter widgets into a class

我正在嘗試構建一個包含ttk.Entryttk.Label的可滾動GUI窗口。

這樣做的唯一方法(如此處的許多問題所述)是通過創建一個Canvas ,其中包含一個包含所有小部件的框架。

因此,我的目標是使此類成為一個包含所有所需小部件的框架作為參數,並將其顯示在具有水平和垂直滾動條的窗口中(因為我在代碼內部的許多顯示器中都需要它)。

成功編碼后-我嘗試制作一個類,但只顯示空的綠色畫布。

有什么想法我做錯了嗎?

import tkinter as tk
from tkinter import ttk


class CanvasWidgets(ttk.Frame):
    def __init__(self, master, frame_in, width=100, height=100):
        ttk.Frame.__init__(self, master)

        self.master = master
        self.frame = frame_in
        self.width, self.height = width, height

        self.build_gui()

    def build_gui(self):
        self.canvas = tk.Canvas(self.master, self.width, self.height, bg='light green')
        # self.frame = ttk.Frame(self.frame_in)

        self.frame.bind("<Configure>", self.onFrameConfigure)
        self.vsb = tk.Scrollbar(self.frame, orient="vertical", command=self.canvas.yview)
        self.hsb = tk.Scrollbar(self.frame, orient="horizontal", command=self.canvas.xview)
        self.canvas.configure(yscrollcommand=self.vsb.set, xscrollcommand=self.hsb.set)
        self.vsb.grid(row=0, column=1, sticky=tk.N + tk.S + tk.W)
        self.hsb.grid(row=1, column=0, sticky=tk.W + tk.N + tk.E)
        self.canvas.create_window((4, 4), window=self.frame, anchor="nw")

        self.canvas.grid(row=0, column=0)

    def onFrameConfigure(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))


root = tk.Tk()
frame = ttk.Frame(root)

rows, cols = 5, 5
for row in range(rows):
    for col in range(cols):
        ttk.Label(frame, text=[row, col], relief=tk.SUNKEN, width=5).grid(row=row, column=col, sticky=tk.E)

a = CanvasWidgets(root, frame)
a.grid()
root.mainloop()

第一個問題是,你是把畫布在master時,它需要在self CanvasWindow實例視為要在其中放置其他所有內容的框。

第二個問題是,因為框架是在畫布之前創建的,所以框架的堆疊順序比畫布低。 您需要調用框架上的lift ,使其位於畫布上方。

第三個問題是您要將滾動條放入frame 您不能將它們放在內部框架中,因為它們控制內部框架。 相反,他們還需要保持self 滾動條和畫布都需要共享一個公共父級。

第四個問題是框架不是畫布的子元素,因此不會被畫布的邊界剪裁。 如果CanvasWidgets創建了框架,然后調用者可以獲取框架並向其添加小部件,那就更好了。

例如:

a = CanvasWidgets(root)

rows, cols = 5, 5
for row in range(rows):
    for col in range(cols):
        label = ttk.Label(a.frame, text=[row, col], relief=tk.SUNKEN, width=5)
        label.grid(row=row, column=col, sticky=tk.E)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM