2017-11-20 8 views
-1

私はTkinterを初めて使用しました。ループから複数のチェックボックスを作成したいと思います。Tkinter checkboxes created in loopを参照していますが、わかりません。 すべてのファイルをディレクトリにあるチェックボックスとして表示したいとします。tkinterを使ってループ内に複数のチェックボックスを作成するには

私が変更する必要があることを教えてください。

コード:

from tkinter import filedialog,Checkbutton 

import tkinter,os 

window = tkinter.Tk() 

def browse(): 

    filez = filedialog.askdirectory(parent=window,title='Choose a file')#I choose a directory 

    ent1.insert(20,filez)#insert the path of directory to text box 
    dirs = os.listdir(filez)#gives all files of direcory 
    for file in dirs: 
     print(file)#Getting all files 
     var = tkinter.IntVar() 
     c = tkinter.Checkbutton(window,text=file,variable=var)#Create files to checkox 
     c.place(x=0,y=100) 



window.title("First Gui") 

window.geometry("400x400") 
window.wm_iconbitmap("path of icon") 

lbl = tkinter.Label(window,text="path") 

lbl.place(x=0,y=60) 

ent1 = tkinter.Entry(window) 

ent1.place(x=80,y=60) 

btn1 = tkinter.Button(window,text="Set Path",command=browse) 

btn1.place(x=210,y=57) 


window.mainloop() 

私はブラウズ機能

+0

あなたはすべてのチェックボックスを 'c.place(x = 0、y = 100) 'の1つの場所に置きます。 'pack()'や 'grid()'の方が使いやすくなります。 – furas

答えて

1

を使用して、チェックボックスなどのディレクトリのすべてのファイルを表示するためにしたいパスを設定し、ボタンをクリックした後、私は三つの問題

  1. を見ます

    はすべてCheckbuttonsになりますので、最後の1つしか表示されません。最後のものの後ろに隠されています。 。

  2. すべてCheckbuttonあなたがリストまたは辞書に保持することができるIntVarが必要です。

  3. 新しいパスを選択すると、以前のCheckbuttonsを削除する必要がありますので、リストまたは辞書で覚えておく必要があります。

例では、簡単にすべてのCheckbuttonsを入れてpack()の代わりplace()を使用することができます方法を示しています。また、辞書を使用してIntVarsを保ち、選択されたものを確認する方法、およびリストを使用してCheckbuttonsを保持し、後でそれらをウィンドウから削除する方法を示します。

import tkinter 
import tkinter.filedialog 
import os 

# --- functions --- 

def browse(): 

    filez = tkinter.filedialog.askdirectory(parent=window, title='Choose a file') 

    ent1.insert(20, filez) 

    dirs = os.listdir(filez) 

    # remove previous IntVars 
    intvar_dict.clear() 

    # remove previous Checkboxes 
    for cb in checkbutton_list: 
     cb.destroy() 
    checkbutton_list.clear() 

    for filename in dirs: 
     # create IntVar for filename and keep in dictionary 
     intvar_dict[filename] = tkinter.IntVar() 

     # create Checkbutton for filename and keep on list 
     c = tkinter.Checkbutton(window, text=filename, variable=intvar_dict[filename]) 
     c.pack() 
     checkbutton_list.append(c) 

def test(): 
    for key, value in intvar_dict.items(): 
     if value.get() > 0: 
      print('selected:', key) 

# --- main --- 

# to keep all IntVars for all filenames 
intvar_dict = {} 
# to keep all Checkbuttons for all filenames 
checkbutton_list = [] 

window = tkinter.Tk() 

lbl = tkinter.Label(window, text="Path") 
lbl.pack() 

ent1 = tkinter.Entry(window) 
ent1.pack() 

btn1 = tkinter.Button(window, text="Select Path", command=browse) 
btn1.pack() 

btn1 = tkinter.Button(window, text="Test Checkboxes", command=test) 
btn1.pack() 

window.mainloop() 
+0

ありがとうございます。私はファイルを持っていますが、画面に移動しています。スクロールバーを追加するには? –

+0

スクロールバーを[Listbox](http://effbot.org/tkinterbook/listbox.htm)に追加するのは簡単ですが、ウィジェットのグループには追加できません。唯一の解決策は、 'Checkbuttons'を' Frame'に、 'Frame'を' Canvas'に入れ、 'Canvas'をスクロールすることです。あなたはいくつかの例を見つけることができます。昨日はイベントの質問でした。 – furas

+0

GitHub [scrolled-frame.py](https://github.com/furas/python-examples/blob/master/tkinter/scrolled-frame-canvas/scrolled)にスクロールフレームの例を載せました-frame.py) – furas

関連する問題