Tkinter:相对地在Canvas中逐个放置标签。

时间:2017-09-16 17:49:59

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

我想一个接一个地在画布上安排标签。但是,展示位置并没有按照需要出现。

以下是在画布中插入标签的功能。但是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

以下是集成canvas小部件的代码。计算按钮调用计算功能。

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. 我尝试将滚动添加到画布。但该应用程序没有响应,也没有弹出。

  3. 添加滚动条的代码:

    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)
    

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

1 个答案:

答案 0 :(得分:0)

如果要滚动放在画布中的小部件,则需要使用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()