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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

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

Python

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

Q&A

解決済

3回答

4007閲覧

チェックボックス部分を表示の切り替わるボタンに置き換えて現在の機構を再現したい。

fuji36_om

総合スコア8

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/09/20 12:34

編集2020/09/21 10:10

前提・実現したいこと

チェックボックス部分にチェックを入れたり外したりすることで、機能を切り替える仕組み作りました。
これをtkinterのみでトグルボタンに置き換えて、機能を再現したいと考えていますが。
構文が思いつかず、このサイトを頼った次第です。

発生している問題・エラーメッセージ

構文が思いつかず、syntax errorしか作れていません。

該当のソースコード

組み込み先のデータです。
チェックボックス(チェックボタン?)部分のみの置き換えで記述していただければ幸いです。

python

1#tkinterのインポート 2import tkinter as tk 3 4# ウィンドウを作成 5root = tk.Tk() 6root.title("Hello, World!") 7root.geometry("500x300") 8 9b = tk.Label(text="コントロール画面") 10b.pack() 11 12def btn_click1(): 13 if( var.get() == True): 14 print('txt_1.(/・ω・)/にゃー!') 15 txt_1.insert(tk.END,'(/・ω・)/にゃー!') 16 else: 17 print('txt_1.(」・ω・)」うー!') 18 txt_1.insert(tk.END,'(」・ω・)」うー!') 19 20def btn_click2(): 21 if( var.get() == True): 22 print('txt_2.(/・ω・)/にゃー!') 23 txt_2.insert(tk.END,'(/・ω・)/にゃー!') 24 else: 25 print('txt_2.(」・ω・)」うー!') 26 txt_2.insert(tk.END,'(」・ω・)」うー!') 27 28def btn_click3(): 29 if( var.get() == True): 30 print('txt_3.(/・ω・)/にゃー!') 31 txt_3.insert(tk.END,'(/・ω・)/にゃー!') 32 else: 33 print('txt_3.(」・ω・)」うー!') 34 txt_3.insert(tk.END,'(」・ω・)」うー!') 35 36var = tk.BooleanVar() 37 38def change(): 39 if( var.get() == True): 40 button1.config(text='(/・ω・)/にゃー!') 41 button2.config(text='(/・ω・)/にゃー!') 42 button3.config(text='(/・ω・)/にゃー!') 43 else: 44 button1.config(text='(」・ω・)」うー!') 45 button2.config(text='(」・ω・)」うー!') 46 button3.config(text='(」・ω・)」うー!') 47 48def clear(): 49 txt_1.delete(0,tk.END) 50 txt_2.delete(0,tk.END) 51 txt_3.delete(0,tk.END) 52 53t_btn = tk.Checkbutton(variable=var, text="(」・ω・)」うー! / (/・ω・)/にゃー!",command = change, width=20).place(x=30, y=30) 54 55button1 = tk.Button(root, text='(」・ω・)」うー!', command=btn_click1) 56button1.place(width=80, x=30, y=80) 57button2 = tk.Button(root,text='(」・ω・)」うー!',command = btn_click2) 58button2.place(width=80, x=30, y=120) 59button3 = tk.Button(root,text='(」・ω・)」うー!',command = btn_click3) 60button3.place(width=80, x=30, y=160) 61 62Clear_button = tk.Button(root,text='クリア',command = clear) 63Clear_button.place(width=50,x=25,y=250) 64 65txt_1 = tk.Entry(width=50) 66txt_1.place(x=120, y=82) 67 68txt_2 = tk.Entry(width=50) 69txt_2.place(x=120, y=122) 70 71txt_3 = tk.Entry(width=50) 72txt_3.place(x=120, y=162) 73 74root.mainloop( )

トグルボタンは下記のHPを参考にしました。
ボタンの位置指定の書き換えも失敗しているので、その個所も教えていただければ幸いです。
Simple Tkinter Toggle Button

python

1import tkinter as tk 2 3def toggle(tog=[0]): 4 tog[0] = not tog[0] 5 if tog[0]: 6 t_btn.config(text='(/・ω・)/にゃー!') 7 else: 8 t_btn.config(text='(」・ω・)」うー!') 9root = tk.Tk() 10t_btn = tk.Button(text="(」・ω・)」うー!", width=20, command=toggle) 11t_btn.pack(pady=5) 12root.mainloop() 13

試したこと(9/21追記)

ボタンに置き換えと表示の切り替えはできるようになったが、機能の切り替えがうまくいかない。
btn_click1~3にtoggle()が切り替わった情報を入れる方法がわからない。

python

1#tkinterのインポート 2import tkinter as tk 3 4# ウィンドウを作成 5root = tk.Tk() 6root.title("Hello, World!") 7root.geometry("500x300") 8 9b = tk.Label(text="コントロール画面") 10b.pack() 11 12def btn_click1(): 13 if(toggle() == tog[0]): 14 print('txt_1.(/・ω・)/にゃー!') 15 txt_1.insert(tk.END,'(/・ω・)/にゃー!') 16 else: 17 print('txt_1.(」・ω・)」うー!') 18 txt_1.insert(tk.END,'(」・ω・)」うー!') 19 20def btn_click2(): 21 if(toggle() == tog[0]): 22 print('txt_2.(/・ω・)/にゃー!') 23 txt_2.insert(tk.END,'(/・ω・)/にゃー!') 24 else: 25 print('txt_2.(」・ω・)」うー!') 26 txt_2.insert(tk.END,'(」・ω・)」うー!') 27 28def btn_click3(): 29 if(toggle() == tog[0]): 30 print('txt_3.(/・ω・)/にゃー!') 31 txt_3.insert(tk.END,'(/・ω・)/にゃー!') 32 else: 33 print('txt_3.(」・ω・)」うー!') 34 txt_3.insert(tk.END,'(」・ω・)」うー!') 35 36 37def clear(): 38 txt_1.delete(0,tk.END) 39 txt_2.delete(0,tk.END) 40 txt_3.delete(0,tk.END) 41 42 43def toggle(tog=[0]): 44 tog[0] = not tog[0] 45 if tog[0]: 46 t_btn. config(text='(/・ω・)/にゃー!') 47 button1.config(text='(/・ω・)/にゃー!') 48 button2.config(text='(/・ω・)/にゃー!') 49 button3.config(text='(/・ω・)/にゃー!') 50 return not tog[0] 51 52 else: 53 t_btn. config(text='(」・ω・)」うー!') 54 button1.config(text='(」・ω・)」うー!') 55 button2.config(text='(」・ω・)」うー!') 56 button3.config(text='(」・ω・)」うー!') 57 return not tog[0] 58 59 60t_btn = tk.Button(text="(」・ω・)」うー!", width=20, command=toggle) 61t_btn.place(width=100,x=30, y=30) 62 63 64button1 = tk.Button(root, text='(」・ω・)」うー!', command=btn_click1) 65button1.place(width=80, x=30, y=80) 66button2 = tk.Button(root,text='(」・ω・)」うー!',command = btn_click2) 67button2.place(width=80, x=30, y=120) 68button3 = tk.Button(root,text='(」・ω・)」うー!',command = btn_click3) 69button3.place(width=80, x=30, y=160) 70 71Clear_button = tk.Button(root,text='クリア',command = clear) 72Clear_button.place(width=50,x=25,y=250) 73 74txt_1 = tk.Entry(width=50) 75txt_1.place(x=120, y=82) 76 77txt_2 = tk.Entry(width=50) 78txt_2.place(x=120, y=122) 79 80txt_3 = tk.Entry(width=50) 81txt_3.place(x=120, y=162) 82 83root.mainloop( )

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

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

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

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

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

teamikl

2020/09/20 19:34

本題ではないかもしれませんが、気になった点。 t_btn = tk.Checkbutton(~略~).place(x=30, y=30) では、place() の 戻り値が t_btn に入る為、None になってしまうので、 後々ウィジェットを参照する場合は、pack/grid/place は1行にせず 下に掲載されてるコードのように別けて書く必要があります。 掲載のコードは正常に実行できたので、どこがエラーになったのか解りませんが、 t_btn 変数関連でエラーになってた場合は、見直してください。 (SyntaxError は心当たり有りません。この場合は大抵AttributeError になります)
guest

回答3

0

回答内容を参考にし、以下の通りにしました。

python

1#tkinterのインポート 2import tkinter as tk 3 4# ウィンドウを作成 5root = tk.Tk() 6root.title("Hello, World!") 7root.geometry("500x300") 8 9b = tk.Label(text="コントロール画面") 10b.pack() 11 12 13def clear(): 14 txt_1.delete(0,tk.END) 15 txt_2.delete(0,tk.END) 16 txt_3.delete(0,tk.END) 17 18def toggle(): 19 global var 20 if var == 0: 21 var = 1 22 var1.set('(/・ω・)/にゃー!') 23 var2.set('(/・ω・)/にゃー!') 24 var3.set('(/・ω・)/にゃー!') 25 button_var.set('(/・ω・)/にゃー!') 26 27 else: 28 var = 0 29 var1.set('(」・ω・)」うー!') 30 var2.set('(」・ω・)」うー!') 31 var3.set('(」・ω・)」うー!') 32 button_var.set('(」・ω・)」うー!') 33 34def btn_click1(): 35 if var1.get() == '(」・ω・)」うー!': 36 txt_1.insert(tk.END,'(」・ω・)」うー!') 37 else: 38 txt_1.insert(tk.END,'(/・ω・)/にゃー!') 39 40def btn_click2(): 41 if var2.get() == '(」・ω・)」うー!': 42 txt_2.insert(tk.END,'(」・ω・)」うー!') 43 else: 44 txt_2.insert(tk.END,'(/・ω・)/にゃー!') 45 46def btn_click3(): 47 if var3.get() == '(」・ω・)」うー!': 48 txt_3.insert(tk.END,'(」・ω・)」うー!') 49 else: 50 txt_3.insert(tk.END,'(/・ω・)/にゃー!') 51 52var = 0 53 54var1 = tk.StringVar() 55var2 = tk.StringVar() 56var3 = tk.StringVar() 57button_var = tk.StringVar() 58 59var1.set('(」・ω・)」うー!') 60var2.set('(」・ω・)」うー!') 61var3.set('(」・ω・)」うー!') 62button_var.set('(」・ω・)」うー!') 63 64t_btn = tk.Button(textvariable=button_var, width=20, command=toggle) 65t_btn.place(width=100,x=30, y=30) 66 67 68button1 = tk.Button(root, textvariable=var1, command=btn_click1) 69button1.place(width=80, x=30, y=80) 70button2 = tk.Button(root, textvariable=var2,command = btn_click2) 71button2.place(width=80, x=30, y=120) 72button3 = tk.Button(root, textvariable=var3,command = btn_click3) 73button3.place(width=80, x=30, y=160) 74 75Clear_button = tk.Button(root,text='クリア',command = clear) 76Clear_button.place(width=50,x=25,y=250) 77 78txt_1 = tk.Entry(width=50) 79txt_1.place(x=120, y=82) 80 81txt_2 = tk.Entry(width=50) 82txt_2.place(x=120, y=122) 83 84txt_3 = tk.Entry(width=50) 85txt_3.place(x=120, y=162) 86 87root.mainloop( )

ご回答いただき、ありがとうございました。

投稿2020/09/21 11:49

fuji36_om

総合スコア8

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

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

0

ベストアンサー

  • テキスト内容の変更はtk.StringVar()を使用し、textvariableに代入してあげると便利です。

variableとは日本語で可変という意味であり、テキストの中身を変えたりする動的な処理を行いたい時に便利です。
var1, var2, var3, button_varとそれぞれ用意し、.set()でvarの中に文字列をセットしています。

  • 現在の状態を判定するには、適当に変数を用意してあげるとわかりやすいでしょう

今回の場合はvarという名前で変数を定義し、変数の中身を0や1に代入し直す事で、現在の状態を判定しています。
関数toggle()で、現在の状態が0の場合には~/現在の状態が1の場合には~と処理を分けています。
また関数toggle()の中でglobal varという記述がありますが、関数の外で定義された変数を関数内で参照する場合には、global宣言といって関数の中で使用したい変数を宣言してあげる必要があります。
今回のケースではif var == 0:とif文でvarの中身を判定する為に参照する為にglobal varと宣言しています。

python

1#tkinterのインポート 2import tkinter as tk 3 4# ウィンドウを作成 5root = tk.Tk() 6root.title("Hello, World!") 7root.geometry("500x300") 8 9b = tk.Label(text="コントロール画面") 10b.pack() 11 12 13def clear(): 14 txt_1.delete(0,tk.END) 15 txt_2.delete(0,tk.END) 16 txt_3.delete(0,tk.END) 17 18def toggle(): 19 global var 20 if var == 0: # もしもvarが0だった場合には 21 var = 1 # varの中身を1にし、以下でテキスト内容を変更する 22 var1.set('(/・ω・)/にゃー!') 23 var2.set('(/・ω・)/にゃー!') 24 var3.set('(/・ω・)/にゃー!') 25 button_var.set('(/・ω・)/にゃー!') 26 27 else: # もしもvarが0じゃなかった場合には 28 var = 0 # varの中身を0にし、以下でテキスト内容を変更する 29 var1.set('(」・ω・)」うー!') 30 var2.set('(」・ω・)」うー!') 31 var3.set('(」・ω・)」うー!') 32 button_var.set('(」・ω・)」うー!') 33 34# StringVarの中身は.get()で取得出来ます。 35# StringVarの中身が指定の文字列と一致した場合には.set()で中身の文字列を変更しましょう。 36def btn_click1(): 37 if var1.get() == '(」・ω・)」うー!': 38 var1.set('(/・ω・)/にゃー!') 39 else: 40 var1.set('(」・ω・)」うー!') 41 42def btn_click2(): 43 if var2.get() == '(」・ω・)」うー!': 44 var2.set('(/・ω・)/にゃー!') 45 else: 46 var2.set('(」・ω・)」うー!') 47 48def btn_click3(): 49 if var3.get() == '(」・ω・)」うー!': 50 var3.set('(/・ω・)/にゃー!') 51 else: 52 var3.set('(」・ω・)」うー!') 53 54var = 0 # 現在の状態を判定する為の変数 55 56# テキストを動的に操作するにはtk.StringVar()が便利です。 57# まずは必要数用意しましょう。 58var1 = tk.StringVar() 59var2 = tk.StringVar() 60var3 = tk.StringVar() 61button_var = tk.StringVar() 62 63var1.set('(」・ω・)」うー!') 64var2.set('(」・ω・)」うー!') 65var3.set('(」・ω・)」うー!') 66button_var.set('(」・ω・)」うー!') 67 68t_btn = tk.Button(textvariable=button_var, width=20, command=toggle) 69t_btn.place(width=100,x=30, y=30) 70 71 72button1 = tk.Button(root, textvariable=var1, command=btn_click1) 73button1.place(width=80, x=30, y=80) 74button2 = tk.Button(root, textvariable=var2,command = btn_click2) 75button2.place(width=80, x=30, y=120) 76button3 = tk.Button(root, textvariable=var3,command = btn_click3) 77button3.place(width=80, x=30, y=160) 78 79Clear_button = tk.Button(root,text='クリア',command = clear) 80Clear_button.place(width=50,x=25,y=250) 81 82txt_1 = tk.Entry(width=50) 83txt_1.place(x=120, y=82) 84 85txt_2 = tk.Entry(width=50) 86txt_2.place(x=120, y=122) 87 88txt_3 = tk.Entry(width=50) 89txt_3.place(x=120, y=162) 90 91root.mainloop( )

投稿2020/09/21 10:46

nto

総合スコア1438

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

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

fuji36_om

2020/09/21 11:41

本命のテキストボックスにインサートする機能が…。
nto

2020/09/21 11:55

仕様を勘違いしておりました。 そうですね。.set()ではなくinsertにしてあげれば正常に機能してくれると思います。
guest

0

おそらくは以下の様なトグルボタンを生成したいということでのご質問という事でしょうか?
残念ながらtkinterでは以下の様なトグルボタンのウィジェットはない為、生成する事はできません。
toggle_image

現時点で、掲載されているコードはまさにトグルボタンとしての役割を既に果たしており
更にこだわって再現するというのならばcanvasなどでボタンを描画し
クリックした際のアクションをイベントとして用意してあげる事で再現ができるのではないでしょうか。
(下記コードはお粗末な図形描画で申し訳ありません。)

またgiというツールキットのモジュールには
予めトグルボタンのウィジェットが用意されている様です。
補足:python3.5以上は使用できない模様です。
参考ページ:https://python-gtk-3-tutorial.readthedocs.io/en/latest/button_widgets.html#id5

python

1import tkinter as tk 2 3 4class MainWindow(tk.Frame): 5 def __init__(self, master): 6 super().__init__(master) 7 self.master = master 8 self.create_canvas() 9 10 # 図形の描画 11 def create_canvas(self): 12 self.canvas = tk.Canvas(self.master) 13 self.canvas.grid() 14 15 self.round_rectangle(50, 50, 150, 100, radius=50, fill="#24a7d6") 16 17 self.canvas.create_oval(54, 54, 96, 96, fill='#ccd5d9', outline='', tag='toggle_on') 18 self.canvas.tag_bind('toggle_on', '<Button-1>', lambda event: self.toggle_switch(0)) 19 self.canvas.tag_bind('toggle_off', '<Button-1>', lambda event: self.toggle_switch(1)) 20 21 # 引数iでon/offを判定し、イベントを振り分ける 22 def toggle_switch(self, i): 23 if i == 0: 24 self.canvas.itemconfig(self.toggle_frame, fill='#7f8385') 25 self.canvas.delete('toggle_on') 26 self.canvas.create_oval(104, 54, 146, 96, fill='#ccd5d9', outline='', tag='toggle_off') 27 if i == 1: 28 self.canvas.itemconfig(self.toggle_frame, fill='#24a7d6') 29 self.canvas.delete('toggle_off') 30 self.canvas.create_oval(54, 54, 96, 96, fill='#ccd5d9', outline='', tag='toggle_on') 31 32 # 矩形の角を丸くする 33 def round_rectangle(self, x1, y1, x2, y2, radius=25, **kwargs): 34 points = [x1+radius, y1, 35 x1+radius, y1, 36 x2-radius, y1, 37 x2-radius, y1, 38 x2, y1, 39 x2, y1+radius, 40 x2, y1+radius, 41 x2, y2-radius, 42 x2, y2-radius, 43 x2, y2, 44 x2-radius, y2, 45 x2-radius, y2, 46 x1+radius, y2, 47 x1+radius, y2, 48 x1, y2, 49 x1, y2-radius, 50 x1, y2-radius, 51 x1, y1+radius, 52 x1, y1+radius, 53 x1, y1] 54 55 self.toggle_frame = self.canvas.create_polygon(points, **kwargs, smooth=True) 56 return self.toggle_frame 57 58if __name__ == '__main__': 59 root = tk.Tk() 60 window = MainWindow(master = root) 61 window.mainloop()

投稿2020/09/20 18:18

nto

総合スコア1438

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

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

fuji36_om

2020/09/21 02:15

単純にyoutube等に見られるような「再生/一時停止ボタン」のような押すたびにマークと機能を変更するボタンを作る方法を模索しているだけです。 実践的にプログラミングを扱う方々ならば薬籠中の物かと思い、ぜひともその情報を入手したく適当な試作品を交えて質問させていただきました。 ホームページでは貴殿のおっしゃる通りのものしか見つけることができず、自分が入手したい情報ではありませんでした。 あれのことをトグルボタンだと思っていたのですが、あれの正式名称は何なのでしょうか? あの機構はどのようにして作られているのでしょうか?
nto

2020/09/21 03:04 編集

teamiklさん なるほど。selectimageで振り分けるという事ですね。 綺麗に再現出来ていますね。 fuji36_onさん 確かにトグルボタンではありますが、あれ自体に特に正式名称といったものはなく通称は再生ボタンでいいのではないでしょうか?一般的にはトグルボタンというと回答に掲載したimageが一般的かと思います。 やっている事や仕組みは同じで、ボタンをクリックした時に現在の描画が再生のマークだったならば一時停止のマークに描画を切り替え、再生を行う処理を。もしボタンが一時停止のマークだったならば再生のマークに描画を切り替え一時停止を行う処理を。と、処理の内容を振り分けるといった流れで再現出来るのではないでしょうか?
fuji36_om

2020/09/21 09:55

ボタンの表記している文字は連動して変更するのに成功しましたが 機能を変更できないので、試した事に追加します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問