[英]Python - Passing a frame containing tkinter widgets into a class
我正在嘗試構建一個包含ttk.Entry
和ttk.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.