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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Tkinter

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

Q&A

解決済

1回答

591閲覧

python・tkinterのキーボード操作でボタンを変化させたい

mika341kkaj

総合スコア1

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2022/06/06 12:52

tkinterでキーボード操作のボタン画面を作りたい

pythonのtkinterを使って、キーボード操作で画面を切り替えられるようにしたいです。
Wキー2回で設定画面を開き、
Wキー1回でボタンの色をそれぞれ変化させます。
・PSPのようにPCのキーボードのみで操作できるアプリを作ろうとしています。

課題:変化させたいボタン(set_btn1, set_btn2, set_btn3, set_btn4)がkey_event1という関数下にあるため、変化なし。

試した方法:move_selectを実行した後、key_event1を実行して画面を表示させれば良いのでは?
→Wキーを押すたびに画面が読み込まれて非常にもっさりした操作になったのでボツで。

(画面が変わった後にもボタンを追加する予定なので、init 関数に書く以外の方法でお願いします。)

やはり厳しいでしょうか?アドバイスをお願いいたします。

coding: utf-8

import sys
import os
import datetime
import wave
import pyaudio
import platform
import configparser
import errno

import tflite_runtime.interpreter as tflite
import numpy as np
#from cv2 import resize, imread
import cv2
import tkinter as tk
import tkinter.ttk as ttk
import config
from imageEdit import ImageEditing

#from measure_cam import MeasureCam

class App(tk.Frame):
def init(self, master = None):
super().init(master)
#sound
os.system("amixer cset numid=3 45%")
self.volume = 0
self.num1 = 0
self.btnfont = ("Menlo", 32)
self.btnfont_title = ("Menlo", 38)
self.current_screen = 0

############### # Layout # -----GUIの設定----- # appのフレーム(一番外側) self.pack(fill = 'both', expand=1) self.tkraise() # self.topframe = tk.Frame(self) self.topframe.grid(row=0, column=0, sticky="nsew") self.topframe.tkraise() #Wキーを連続2回押した時のイベント処理 self.bind_all('<Double-KeyPress-w>',self.key_event1) #Wキーを1回押した時のイベント処理 self.bind_all('<KeyPress-w>',self.move_select) self.outframe_count = 0 def key_event1(self,event): print(event) self.current_screen = 0 self.num1 = 0 self.setting = tk.Frame(self) self.setting.grid(row=0, column=0, sticky="nsew") self.set_lab1 = tk.Label(self.setting, text="設定" ,font=self.btnfont_title ,width=12,height=2) self.set_lab1.pack() self.set_btn1 = tk.Button(self.setting,text = '音量' ,command=lambda:[self.act_btn1(1)] ,bd=0 ,bg="white" ) self.set_btn1.pack() self.set_btn2 = tk.Button(self.setting,text = 'テーマカラー' ,command=lambda:[self.act_btn2(2)] ,bd=0 ,bg="white" ) self.set_btn2.pack() self.set_btn3 = tk.Button(self.setting,text = '文字の大きさ' ,command=lambda:[self.act_btn3(3)] ,bd=0 ,bg="white") self.set_btn3.pack() self.set_btn4 = tk.Button(self.setting,text = '設定を閉じる' ,command=lambda:[self.setting.grid_forget] ,bd=0 ,bg="white") self.set_btn4.pack() #settingのボタンアクション_音声On/Off def act_btn1(self,event): print(event) self.current_screen = 1 self.num1 = 0 self.ini_check() #設定画面を閉じる self.setting.grid_forget() self.set_btn1 = tk.Frame(self) self.set_btn1.grid(row=0, column=0, sticky="nsew") self.set_btn1_label = tk.Label(self.set_btn1 ,text="音量" ) self.set_btn1_label.pack() def move_select(self,event): print(event) if self.current_screen == 0: if self.num1==0: self.set_btn1['bd'] = 2 self.set_btn2['bd'] = 0 self.set_btn3['bd'] = 0 self.set_btn4['bd'] = 0 self.set_btn1['bg'] = "#4DB6EE" self.set_btn2['bg'] = "white" self.set_btn3['bg'] = "white" self.set_btn4['bg'] = "white" self.num1 += 1 elif self.num1==1: self.set_btn1['bd'] =0 self.set_btn2['bd'] = 2 self.set_btn3['bd'] =0 self.set_btn4['bd'] =0 self.set_btn1['bg'] ="white" self.set_btn2['bg'] = "#4DB6EE" self.set_btn3['bg'] ="white" self.set_btn4['bg'] ="white" self.num1 += 1 elif self.num1==2: self.set_btn1['bd']=0 self.set_btn2['bd']=0 self.set_btn3['bd'] = 2 self.set_btn4['bd']=0 self.set_btn1['bg']="white" self.set_btn2['bg']="white" self.set_btn3['bg'] = "#4DB6EE" self.set_btn4['bg']="white" self.num1 += 1 elif self.num1==3: self.set_btn1['bd']=0 self.set_btn2['bd']=0 self.set_btn3['bd']=0 self.set_btn4['bd'] = 2 self.set_btn1['bg']="white" self.set_btn2['bg']="white" self.set_btn3['bg']="white" self.set_btn4['bg'] = "#4DB6EE" print(self.num1) self.num1 = 0

if name == "main" :
root = tk.Tk()
root.title("test window")
root.geometry("400x400")
app = App( master = root )

app.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

どういう画面でどういうことをしたいのか今一つ理解できないのですが、ざっと見て思うことです。

<Double-KeyPress-w>が発生するたびにkey_event1が呼ばれて、そのたびに画面が表示される動作をするようですが、今のコードだとそのたびに新たにFrameやLabelやボタンが作られていますね。むだですよね。
そういう場合は起動時に生成しておいて、withdraw()で見えなくしたりdeiconify()で見えるようにしたりするのがいいでしょう。
これでいろいろな不具合は解消するのでは?

投稿2022/06/06 13:36

TakaiY

総合スコア12765

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問