質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

574閲覧

自動的に起動させる機能のうちの設定部分を作っていますがうまくいきません。

skysoul

総合スコア111

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/06 02:02

質問

自動的に起動させる機能のうちの設定部分を作っていますがうまくいきません。

問題のコード

python383rc1

1def user_list_up(): 2 global users 3 global all_users 4 users=subprocess.run(['powershell.exe', '-command', '(Get-WmiObject Win32_UserAccount).name'],encoding='utf-8',capture_output=True) 5 all_users=users.stdout.split() 6 7def btn_settei_click(): 8 global settei_butto 9 global auto_up 10 global users 11 global all_users 12 13 tki_settei_log = tkinter.Toplevel() 14 tki_settei_log.geometry('300x300') 15 tki_settei_log.title('設定') 16 canvas = tkinter.Canvas(tki_settei_log) 17 18 settei_button = tkinter.IntVar() 19 settei_button.set(auto_up) 20 21 auto_on = tkinter.Radiobutton(tki_settei_log, value=0, variable=settei_button, text='ON') 22 auto_on.place(x=20, y=50) 23 auto_off = tkinter.Radiobutton(tki_settei_log, value=1, variable=settei_button, text='OFF') 24 auto_off.place(x=20, y=70) 25 26 auto_up_ravel = tkinter.Label(tki_settei_log,text='PCを立ち上げたときと同時にこのアプリも起動する') 27 auto_up_ravel.place(x=20, y=25) 28 29 user_list_up() 30 31 # Frame Widgetを 生成 32 frame = tkinter.Frame(canvas) 33 34 a = [tkinter.BooleanVar()] * len(all_users) 35 z = [tkinter.Checkbutton()] * len(all_users) 36 37 for i in range(0,len(all_users)-1): 38 z[i] = tkinter.Checkbutton(frame, text=all_users[i]) 39 z[i].grid(column=0, row=i) 40 41 setti_check_button = tkinter.Button(tki_settei_log, text='確定', command=btn_check_click) 42 setti_check_button.place(x=250, y=270) 43 44 tki_settei_log.mainloop() 45 46

のコードを実行しても、チェックボタンが生成されません。
len(all_users)は6のはずなのに動きません。

なのに下のコードならいけました。
listは禁止なのでしょうか?

import tkinter root = tkinter.Tk() root.geometry("500x500") # Canvas Widget を生成 canvas = tkinter.Canvas(root) # Top Widget上に Scrollbar を生成して配置 bar = tkinter.Scrollbar(root, orient=tkinter.VERTICAL) bar.pack(side=tkinter.RIGHT, fill=tkinter.Y) bar.config(command=canvas.yview) # ScrollbarでCanvasを制御 # Canvas Widget をTopWidget上に配置 canvas.config(yscrollcommand=bar.set) # Canvasのサイズ変更をScrollbarに通知 canvas.config(scrollregion=(0,0,500,500)) #スクロール範囲 canvas.pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=True) # Frame Widgetを 生成 frame = tkinter.Frame(canvas) # Frame Widgetを Canvas Widget上に配置() canvas.create_window((0,0), window=frame, anchor=tkinter.NW, width=500, height=500) # Frame Widget上に各種ラベルを表示 a0 = tkinter.Checkbutton(frame, text='box') a0.grid(column=0, row=0) a1 = tkinter.Checkbutton(frame, text='box') a1.grid(column=0, row=1) a2 = tkinter.Checkbutton(frame, text='box') a2.grid(column=0, row=2) a3 = tkinter.Checkbutton(frame, text='box') a3.grid(column=0, row=3) root.mainloop()

環境

tkinterあり
subprocessあり
python3.8.3rc1 IDLE
windows10 home

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hope_mucci

2020/06/06 03:46

上のコードはどうやって実行するのですか? 関数定義しているだけに見えます。
skysoul

2020/06/06 03:54

ほかのところで btn_settei = tkinter.Button(tki, text='設定', command=btn_settei_click) btn_settei.place(x=850, y=10) です。 すいません
hope_mucci

2020/06/06 04:25

それも含めてコピペで動くコードを質問文に掲載してくださいな。 「ほかのところ」が「どこ」なのか回答者側はわからないですよ?
guest

回答1

0

ベストアンサー

自動的に起動させる機能については解りませんが、コードの目に付いた問題個所のみ。

リストに関しては、リストの繰り返しでの良くある誤用です
例えば数値型では

  • [1] * 3 => [1, 1, 1]
  • [1 for _ in range(3)] => [1, 1, 1]

一見同じように見えますが、関数など呼び出してみると違いが分かります

  • [print("TEST")] * 3
  • [print("TEST") for _ in range(3)]

※実行して見て下さい

戻り値はどちらも、[None, None, None] ですが、
TEST を表示される回数が異なります。

[tkinter.BooleanVar()] * len(all_users)
BooleanVar を all_users の数だけ生成したいのでしょうが、前者では
BooleanVar が呼び出されるのは一度のみで、リストの要素を同じオブジェクトで埋めているのみ。

任意の回数生成したいのであれば、期待する振る舞いは後者のコードです。


Checkboxに関してはまた別の原因で

コードは実行できなかったので、他にもあるとしたら正確な原因は解りませんが、
生成はされているが表示がされてない状態ではないでしょうか。

掲載されたコードから解る範囲では、
親ウィジェット(frame, canvas)の レイアウトが確認出来ないので、
非表示のままになっている可能性があります。

python

1 z = [None] * len(all_users) # <-- リストを事前準備 None で埋める 2 3 for i in range(0,len(all_users)-1): # <-- 範囲は -1 でいいのですか? 4 z[i] = tkinter.Checkbutton(frame, text=all_users[i]) 5 z[i].grid(column=0, row=i) 6 7 print(z) # <--- 期待通りか確認

Checkbutton は for 文で生成してるため、BooleanVar の様な問題はありません。
ただ、BooleanVar と同じコードは無駄になる為、リスト長さの確保に留めておくとよいです。
適当な数値やNoneで初期化したいような場合に [値] * 要素数 が使えます。

投稿2020/06/06 08:39

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

skysoul

2020/06/07 01:57

範囲は+1でした。 ありがとうございます
skysoul

2020/06/07 02:03

z = [None] * len(all_users) で埋めたら list index out of rangeとでて リストの番号が外れたみたいです
skysoul

2020/06/07 02:06

a = [tkinter.BooleanVar() for _ in range(3)] z = [None] * len(all_users) print(z) for i in range(0,len(all_users)+1): z[i] = tkinter.Checkbutton(frame, text=all_users[i]) z[i].grid(column=0, row=i) を実行したら [] ↑が出てlist index out of rangeが出ました
skysoul

2020/06/07 02:25

[]が出る件は解決しました
skysoul

2020/06/07 02:29

でもなぜかチェックボタンが出てきません
teamikl

2020/06/07 03:12 編集

>親ウィジェット(frame, canvas)の レイアウトが確認出来ないので、 >非表示のままになっている可能性があります。 canvasや frameのレイアウト(packやgrid)を確認してみてください。
skysoul

2020/06/07 11:22

ありがとうございます 直りました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問