2017-09-16 7 views
0

私はキャンバスに次々にラベルを手配したいと思います。しかし、配置は必要に応じて出て​​こない。Tkinter:Canvasを相対的にキャンバスに配置する。

以下は、ラベルをキャンバスに挿入する機能です。しかし、forループのものは重複しています。理由 - 一部のラベルは、他のラベルよりサイズが大きくなっています。したがって、私は最大のサイズが80であり、プレースメントをそれぞれ行うと仮定します。私はこのタイプのアプローチを変更したいと思います。むしろ、ラベルを相対的に1つずつ配置したいと思っています。

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 

以下は、キャンバスウィジェットを統合したコードです。計算ボタンはcalculate関数を呼び出します。

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() 

は実際には、問題の2つの部分があります

  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) 

これは最初の2つのラベルが重なっ取得され、私は、取得しています出力されます。 output - overlapped labels

+0

理由:あなたが問題を重複していて、それをスクロールできるようにするcreate_windowを使用してキャンバス内のフレームを入れないように

私は、あなたがフレームを作成するために、その中のすべてのあなたのラベルをグリッドを提案しますあなたは 'place'を使っていますか? 'pack'(そしてそれほどの程度は' grid')はウィジェットを行や列に簡単に表示させるために設計されています。 –

+0

グリッドを使用すると、キャンバスウィンドウのサイズがそのコンテンツのサイズに縮小されます。 フレームサイズを修正するために、私は場所を使うことを考えました。 – raizsh

+0

'.grid()'はここでははるかに優れているようです。すべてのコンテンツを「キャンバス」に入れることは完全に必要ですか? –

答えて

0

あなたがキャンバス内に置くウィジェットをスクロールしたい場合は、canvas.create_window(x, y, window=label)代わりのlabel.place(...)を使用する必要があります。

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() 
関連する問題