【问题标题】:Tkinter: Placing the Labels one after another in Canvas relatively.Tkinter:相对地在 Canvas 中一个接一个地放置标签。
【发布时间】:2017-09-16 17:49:59
【问题描述】:

我想将画布中的标签一个接一个地排列。但展示位置并没有达到预期。

下面是在画布中插入标签的函数。但是 for 循环中的那些重叠。原因 - 一些标签的尺寸比另一个大。因此,我假设最大尺寸为 80 并分别进行展示位置。我想改变这种方法。相反,我希望标签一个接一个地相对放置。

def calculate(*args):
try:
    ttk.Label(canvas, text="Result:").place(x=20, y=20)
    ttk.Label(canvas, text="Topic:").place(x=20, y=80)
    ttk.Label(canvas, textvariable=topic).place(x=200, y=80)
    ttk.Label(canvas, text="Environment:").place(x=20, y=120)
    ttk.Label(canvas, textvariable=environment).place(x=200, y=120)
    ttk.Label(canvas, text="Event Results:").place(x=20, y=160)

    inputValue=TextArea.get("1.0","end-1c")

    len_max=0
    result={}
    for s in inputValue.splitlines():
        data = MainInstance.searchWithPayload(s)            
        result[s]=data
        if len(s+data) > len_max:
            len_max = len(s+data)

    i = 190
    for key in result.keys():
        print(key)
        print(result[key])
        ttk.Label(canvas, text=key+"\n\n"+result[key], wraplength=800).place(x=20,y = i)
        i = i + 80

except ValueError:
    pass

以下是集成画布小部件的代码。计算按钮调用计算函数。

ttk.Button(page2, text="Exit",command=page1.quit).grid(column=2, row=8)
ttk.Button(page2, text="Calculate", command=calculate).grid(column=3, row=8)

canvas = Canvas(root, width=900, height=universal_height)
canvas.grid(column=1, row=0)


root.mainloop()

其实问题分为两部分:

  1. 如何相对放置标签以停止重叠?

  2. 我尝试将滚动条添加到画布上。但是应用没有响应,也没有弹出。

添加滚动条的代码:

canvas=Canvas(root,bg='#FFFFFF',width=300,height=300,scrollregion=
(0,0,500,500))
hbar=Scrollbar(root,orient=HORIZONTAL)
hbar.pack(side=BOTTOM,fill=X)
hbar.config(command=canvas.xview)
vbar=Scrollbar(root,orient=VERTICAL)
vbar.pack(side=RIGHT,fill=Y)
vbar.config(command=canvas.yview)
canvas.config(width=300,height=300)
canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set)
canvas.pack(side=LEFT,expand=True,fill=BOTH)

这是我得到的输出,其中前两个标签重叠。

【问题讨论】:

  • 你为什么使用placepack(在较小程度上,grid)旨在轻松地使小部件出现在行和/或列中。
  • 使用网格,画布窗口的大小减小到其内容的大小。修复我想到的使用place的帧大小。
  • 在我看来.grid() 在这里对你来说会好得多。是否完全有必要将所有内容放入canvas

标签: python python-3.x canvas tkinter tk


【解决方案1】:

如果要滚动放置在画布中的小部件,则需要使用canvas.create_window(x, y, window=label) 而不是label.place(...)

我建议您创建一个框架,将所有标签在其中网格化,这样您就不会遇到重叠问题,并使用 create_window 将框架放在画布内以便能够滚动它:

import tkinter as tk
from tkinter import ttk


def on_resize(event):
    """Resize canvas scrollregion when the canvas is resized."""
    canvas.configure(scrollregion=canvas.bbox('all'))

root = tk.Tk()
root.geometry('100x100')

root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

canvas = tk.Canvas(root)

frame = ttk.Frame(canvas)
# create and grid the labels
for i in range(3):
    for j in range(3):
        ttk.Label(frame, text="Label %i-%i" % (i, j)).grid(row=i, column=j, padx=10, pady=10)
# put the frame in the canvas
canvas.create_window(0, 0, anchor='nw', window=frame)
# add the scrollbars
vbar = ttk.Scrollbar(root, orient='vertical', command=canvas.yview)
hbar = ttk.Scrollbar(root, orient='horizontal', command=canvas.xview)
canvas.configure(xscrollcommand=hbar.set,
                 yscrollcommand=vbar.set,
                 scrollregion=canvas.bbox('all'))

canvas.grid(row=0, column=0, sticky='eswn')
vbar.grid(row=0, column=1, sticky='ns')
hbar.grid(row=1, column=0, sticky='ew')

canvas.bind('<Configure>', on_resize)

root.mainloop()

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    相关资源
    最近更新 更多