【问题标题】:Tkinter: making a frame inside a canvas the width of the canvasTkinter:在画布内制作一个画布宽度的框架
【发布时间】:2020-03-17 18:55:38
【问题描述】:

我在画布内使用框架,因此可以在使用网格布局时添加滚动条。 我正在使用网格布局,因为显示的信息(结果)的宽度并不完全相同,但我希望列具有相同的尺寸。

但是,我希望框架(蓝色)通过在列之间平均划分所有空间来占据画布(黄色)的所有空间: image here

这是我上面显示的图片的代码:

import tkinter as tk

class SeeTransactions():

    def showInterface(self):

        self.frameCanvas = tk.Frame(window)
        self.frameCanvas.grid(row=0, column=0, pady=(5, 0), sticky='news')
        self.frameCanvas.grid_rowconfigure(0, weight=1)
        self.frameCanvas.grid_columnconfigure(0, weight=1)
        self.frameCanvas.grid_propagate(False)

        self.canvas = tk.Canvas(self.frameCanvas, bg = 'yellow')
        self.canvas.grid(row=0, column=0, sticky="news")

        self.frameDatabase = tk.Frame(self.canvas, bg = 'blue')
        self.frameDatabase.grid(row = 0, column = 0, sticky = 'news')

        self.canvas.create_window((0, 0), window=self.frameDatabase, anchor='nw')

        self.vsb = tk.Scrollbar(self.frameCanvas, orient="vertical", command=self.canvas.yview)
        self.vsb.grid(row=0, column=1, sticky='ns')
        self.canvas.configure(yscrollcommand=self.vsb.set)

        self.showDatabase()


    def showDatabase(self):

        result = >some list

        for row in range(len(result)):

            for column in range(1, 5):

                tk.Label(self.frameDatabase, text = result[row][column]).grid(row = row, column = column - 1)

                self.frameDatabase.columnconfigure(column, weight = 1, uniform = 'all')

            tk.Label(self.frameDatabase, text = result[row][5]).grid(row = row, column = 4, columnspan = 2, sticky = 'w')

        self.frameDatabase.columnconfigure(4, weight = 1, uniform = 'all')

        self.frameDatabase.update_idletasks()

        self.frameCanvas.config(width=891, height=400)

        self.canvas.config(scrollregion=self.canvas.bbox("all"))



window = tk.Tk()
window.title('MyBudget')
window.geometry('891x531')

seeTransactions = SeeTransactions()

seeTransactions.showInterface()

window.mainloop()

有人知道怎么解决吗?如果是这样,请告诉我。 (使用python 3)

【问题讨论】:

标签: python canvas tkinter


【解决方案1】:

您需要在标签实例化中添加宽度规范,以及 在列配置语句中填充以扩展列以适应可用空间。

宽度规格确保所有标签的大小相同。

代码: 将 tkinter 导入为 tk

class SeeTransactions():

    def showInterface(self):

        self.frameCanvas = tk.Frame(window)
        self.frameCanvas.grid(row=0, column=0, pady=(5, 0), sticky='news')
        self.frameCanvas.grid_rowconfigure(0, weight=1)
        self.frameCanvas.grid_columnconfigure(0, weight=1)
        self.frameCanvas.grid_propagate(False)

        self.canvas = tk.Canvas(self.frameCanvas, bg = 'yellow')
        self.canvas.grid(row=0, column=0, sticky="news")

        self.frameDatabase = tk.Frame(self.canvas, bg = 'blue')
        self.frameDatabase.grid(row = 0, column = 0, sticky = 'news')

        self.canvas.create_window((0, 0), window=self.frameDatabase, anchor='nw')

        self.vsb = tk.Scrollbar(self.frameCanvas, orient="vertical",     command=self.canvas.yview)
        self.vsb.grid(row=0, column=1, sticky='ns')
        self.canvas.configure(yscrollcommand=self.vsb.set)
        self.showDatabase()

def showDatabase(self):
    result = [[f'line{i}{j}' for i in range(10)] for j in range(20)]
    for row in range(len(result)):
        for column in range(1, 5):
            tk.Label(self.frameDatabase, text = result[row][column], width = 15).grid(row = row, column = column - 1)

            self.frameDatabase.columnconfigure(column, weight = 1, uniform = 'all',pad = 100)

        tk.Label(self.frameDatabase, text = result[row][5], width = 15).grid(row = row, column = 4, columnspan = 2, sticky = 'w')

    self.frameDatabase.columnconfigure(4, weight = 1, uniform = 'all',pad = 100)

    self.frameDatabase.update_idletasks()

    self.frameCanvas.config(width=891, height=400)

    self.canvas.config(scrollregion=self.canvas.bbox("all"))



window = tk.Tk()
window.title('MyBudget')
window.geometry('891x531')

seeTransactions = SeeTransactions()

seeTransactions.showInterface()

【讨论】:

  • 我只是使用了 pad 和 width 的数量来使这个例子看起来正确。我留下了实际计算来确定宽度和填充量作为你们所有人的练习
猜你喜欢
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多