2017-03-09 7 views
0

メインフレーム内のフレームまたはキャンバス内に設定したい動的な追加および削除可能な入力フィールドがあります。フレームが消えるか、入力フィールドで動的に拡大します。入力フィールドがウィンドウのサイズを超えた場合、キャンバスにスクロールバーを使用させたいどのように動的に追加された項目フィールドを、サイズ変更されていないセットフレームまたはキャンバスに配置するのですか?

from tkinter import * 
import tkinter as tk 
class Demo2: 
    def __init__(self, master): 
     global rows 

    self.master = master  
    self.frame = tk.Frame(self.master) 
    master.title("test") 

    self.frame.pack() 
    addboxButton = Button(self.frame, text='<Add Time Input>', fg="Red", command=self.addBox) 
    addboxButton.pack() 

これは、私のボタンが追加され、削除される場所です。

def addBox(self):   
    def delete(): 
     delboxButton.grid_remove() 
     ent1.delete(0,END) 
     ent2.delete(0,END) 
     ent1.grid_remove() 
     ent2.grid_remove() 
    root = self.frame 
    frame=Frame(root,width=900,height=900) 
    frame.pack() 
    canvas=Canvas(frame,bg='#FFFFFF',width=700,height=300,scrollregion=(0,0,700,300)) 
    vbar=Scrollbar(frame,orient=VERTICAL) 
    vbar.pack(side=RIGHT,fill=Y) 
    vbar.config(command=canvas.yview) 
    canvas.config(width=700,height=300) 
    canvas.config(yscrollcommand=vbar.set) 
    canvas.pack(side=LEFT,expand=TRUE,fill=BOTH) 

私は最初にエントリの最初のセットを開くときに画面上で開始する方法を理解しようとしています。追加呼び出しをアクションにバインドします。

i = 0 
    ent1 = Entry(canvas) 
    ent1.grid(row=i, column=0,sticky="nsew") 
    i += 1 
    i = 0 
    ent2 = Entry(canvas) 
    ent2.grid(row=i, column=1,sticky="nsew") 
    i += 1   

    delboxButton = Button(canvas, text='delete', fg="Red", command=delete) 
    delboxButton.grid(row=0 ,column=2) 

root = tk.Tk() 
root.title("test Complete") 
root.geometry("500x500") 
app = Demo2(root) 
root.mainloop() 
+0

なぜ "ボックス"ごとに新しいキャンバスを作成していますか?また、キャンバスは 'create_window'で作成したものだけをスクロールすることができるので、' pack'でフレームを追加するとそのフレームはスクロールできません。 –

+0

エントリごとに新しいキャンバスを作成したくありません。 thats私はここで正しい方向にポイントを求める私は今なぜcreate_windowしようとしているが、私は削除をクリックしてもフィールドを削除しません。 @brianOakley – Brandon

+0

私はあなたと一緒にウィンドウを作成し、それらを追加しますが、それはもう一方の上にそれらを積み重ねます。私はi = 10を使って試してみましたが、i + = 20は20を使っていました。行数に必要な量は追加されません。 – Brandon

答えて

0

これが取り組まれている通常の方法は、単一のフレームを作成し、キャンバスcreate_window方法でキャンバスに追加することです。次に、packplaceまたはgridを使用して、フレームに必要なものを配置できます。技術の説明については

Adding a scrollbar to a group of widgets in Tkinter

を参照してくださいここでは技術がボタンによって作成されたウィジェットに対してどのように機能するかを示す例です。私は、削除機能や、すべての機能を含めて、例を短く保つために適切にサイズを変更することはできませんでしたが、削除機能を動作させる方法についてはかなり良い考えがあるようです。あなたが望む行動。

import tkinter as tk 

class Demo2: 
    def __init__(self, master): 
     self.master = master 
     self.entries = [] 

     self.canvas = tk.Canvas(master, width=400, height=200) 
     self.vsb = tk.Scrollbar(master, orient="vertical", command=self.canvas.yview) 
     self.canvas.configure(yscrollcommand=self.vsb.set) 
     self.add_button = tk.Button(master, text="Add", command=self.add) 
     self.container = tk.Frame() 

     self.canvas.create_window(0, 0, anchor="nw", window=self.container) 
     self.add_button.pack(side="top") 
     self.vsb.pack(side="right", fill="y") 
     self.canvas.pack(side="left", fill="both", expand=True) 

     # start with 3 entry widgets 
     self.add() 
     self.add() 
     self.add() 

    def add(self): 
     entry = tk.Entry(self.container) 
     entry.pack(side="top", fill="x") 
     self.canvas.configure(scrollregion=self.canvas.bbox("all")) 

     self.entries.append(entry) 

root = tk.Tk() 
demo = Demo2(root) 
root.mainloop() 
+0

あなたの返事をありがとう私は私のコンピュータに戻ってすぐにあなたの例を見てみるつもり私はちょうど私の質問を正しく言いたくないと思う。ここで私は多くのトラブルに遭う。 – Brandon

+0

これは非常に近いです。私がそれを動作させることができるかどうかを確認しようとしているリンクのIMに感謝します。この例では、forステートメントのフィールドに値を設定します。 i = 0、i + = 1は前と同じように行数を変更しません。私はそれをテストし、私がそれを働かせることができるかどうかを見ていきます。 – Brandon

+0

あなたがガイドラインとして掲示した例を使って私が知ることができるものから、大丈夫です。私はキャンバスをアドフレームの代わりにトップフレームに移動しました。 canvas.configure(scrollregion = canvas.bbox( "all"))を持つ部分は、この行を削除したすべてが失われていて、すべてがバックアップを示していますが、まだスクロールできません。 – Brandon

関連する問題