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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

Q&A

2回答

5123閲覧

PythonのTkinterで、ボタンやラジオボタンの処理を正しく反映させるには?

Pdcs

総合スコア13

Tkinter

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

0グッド

0クリップ

投稿2015/11/06 02:27

編集2022/01/12 10:55

初めて質問します。よろしくお願いします。

macOS10.10.2 の python2.7.6 に標準で入っている Tkinter を使って、スケールバーやボタンに触れると自動的に背景色や文字色を変化させてくれるようなGUIを作ろうとしています。

希望する設定は、
・色を適用させるためのスペース(Labelを使う)を用意する。
・背景色用と文字色用のRGBスケールバーを用意する。このスケールバーを動かすと色が自動的に変化するようにする。
・スケールバーとは独立に「Black」や「Red」などのラベルをつけたボタンをいくつか用意し、それを押すこでも色が適用される。ボタンを押したときに背景色or文字色のどちらに適用されるからは、すぐ近くのラジオボタンを押して選べるようにする。

つまり、このようなもの。
イメージ説明

現在書いているコードをやや簡略化したものを貼ります。
初心者コードなのでクラスとかは使えず、お恥ずかしいですが。
見ていただきたいのはコメントを書いているところ。

Python

1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3 4import sys 5try: 6 import Tkinter as Tk 7except ImportError: 8 import tkinter as Tk #For Python 3 9 10 11 12def change_bg(_): 13 label_sample.configure(bg="#%02x%02x%02x"\ 14 %(scale_bg[0].get(),scale_bg[1].get(),scale_bg[2].get())) 15 16def change_str(_): 17 label_sample.configure(fg="#%02x%02x%02x"\ 18 %(scale_str[0].get(),scale_str[1].get(),scale_str[2].get())) 19 20def set_color(color): 21 if val_radio.get()=="bg": 22 for i in range(3) : scale_bg[i] .set(palette[color][i]) 23 elif val_radio.get()=="str": 24 for i in range(3) : scale_str[i].set(palette[color][i]) 25 26RGB = ["R","G","B"] 27palette = {"Black" :[ 0, 0, 0] , "Gray" :[127,127,127] , "White" :[255,255,255], 28 "Red" :[255, 0, 0] , "Green" :[ 0,255, 0] , "Blue" :[ 0, 0,255]} 29 30 31 32root = Tk.Tk() 33root.geometry("420x360") 34root.resizable(0,0) 35 36label_sample = Tk.Label(root,text="Sample",relief=Tk.RAISED,bd=2,font=(u"",20)) 37label_sample.place(relx=0.35,rely=0.05,relwidth=0.3,relheight=0.13) 38 39label_rgb = [] 40scale_bg = [] 41scale_str = [] 42for i in range(3): 43 label_rgb.append(Tk.Label(root,text=RGB[i])) 44 scale_bg .append(Tk.Scale(root,label="",orient="h",from_=0,to=255,command=change_bg)) 45 scale_str.append(Tk.Scale(root,label="",orient="h",from_=0,to=255,command=change_str)) 46 label_rgb[i].place(relx=0.45,rely=0.22+0.10*i,relwidth=0.10,relheight=0.15) 47 scale_bg[i] .place(relx=0.08,rely=0.22+0.10*i,relwidth=0.35,relheight=0.15) 48 scale_str[i].place(relx=0.57,rely=0.22+0.10*i,relwidth=0.35,relheight=0.15) 49 50val_radio = Tk.StringVar() 51val_radio.set("bg") 52radio_bg = Tk.Radiobutton(text="Background Color",variable=val_radio,value="bg") 53radio_str = Tk.Radiobutton(text="String Color",variable=val_radio,value="str") 54radio_bg .place(relx=0.13,rely=0.60) 55radio_str.place(relx=0.62,rely=0.60) 56#このラジオボタンがうまく機能していない? 57 58 59order = ["Black","Gray","White","Red","Green","Blue"] 60button = [] 61for i in range(len(order)): 62 button.append(Tk.Button(root,text=order[i],command=set_color(order[i]))) 63 button[i].place(relx=0.07+0.29*(i%3),rely=0.68+0.07*(i/3),relwidth=0.28,relheight=0.08) 64 #ボタンを配置した時点で、orderの最後のBlueが適用されてしまっている。なぜ? 65 #それに、ボタンを押しても色が反映されない。 66 67Tk.Button(root,text="exit",command=sys.exit).place(relx=0.78,rely=0.89,relwidth=0.2) 68 69 70root.mainloop(); 71

問題点は、
①起動させたときの背景色は黒であってほしいのに、青色が適用されてしまっている。
②ラジオボタンを選んでボタンを押しても、背景色・文字色に適用されない。

の2点です。

以上、解決法が分かる方いらっしゃれば、ご回答よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

1つ目の問題点は、一部ボタンの配置が変わってしまいますが、orderのBlueとBlackを入れ替えてみたら上手く動作すると思います。

order = ["Black","Gray","White","Red","Green","Blue"] ↓ order = ["Blue","Gray","White","Red","Green","Black"]

投稿2019/08/28 13:56

yoshihoko

総合スコア25

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

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

0

button.append(Tk.Button(root,text=order[i],command=set_color(order[i])))
と書くと、command に 「set_color(order[i]) 関数を呼び出した結果/set_color()関数は返り値が無いので実際にはNone」が設定されます。
button.append(Tk.Button(root,text=order[i],command=lambda:set_color(order[i])))
とすれば、commandに「set_color(order[i])という関数を呼ぶ処理を行う関数」を設定することになるので上手く動作するのではと思います。

投稿2015/11/06 06:26

hiro-k

総合スコア902

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

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

Pdcs

2015/11/17 04:03

ご回答ありがとうございました。 lambda文で解決するかと思ったのですが、動作は変わりませんでした。
hiro-k

2015/11/17 04:09

問題点は2点とも残っていますか? それとも1個目の問題は消えて、でも2個目は残っているのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問