2017-11-01 2 views
2

私は次のコードスニペットを持っています。ボタンをクリックすると、定義された色のリストからフレームカラーを1つずつ変更する必要があることをコード化する必要があります。色のリストからforループを使ってTkinterフレームの色を変更します

from tkinter import * 
from tkinter import ttk 

def ChangeColor(): 
colors = ['red','green', 'orange','blue'] 
for color in colors: 
    #color = entry.get() 
    frame.config(bg = color) 

root = Tk() 
root.title("Title") 

frame = Frame (root, width = 260, height = 200) 
frame.pack() 

btn = ttk.Button(frame, text = 'Change color', command = ChangeColor) 
btn.place (x = 80, y = 100) 

entry = ttk.Entry (frame, width = 20) 
entry.place(x = 80, y = 70) 

root.mainloop() 
+0

をルートにそれを呼び出す必要はありませんあなたは 'for'ループであなたをあなたのインデントと間隔 – AK47

+1

を更新する必要がありますすべての色に変更し、青色になります。 –

+0

はい、それは終わりに達する原因です...私はクリックごとに1つずつ進む必要があります。私はこれのためのループを必要としないかもしれません...私は索引でこれを把握しようとしましたが、それを行うことができませんでした。 – Sabawoon

答えて

5

これはitertoolsのcycleイテレータを使用できます。私が言及する必要が

from tkinter import * 
from tkinter import ttk 
from itertools import cycle 

root = Tk() 
root.title("Title") 

frame = Frame (root, width = 260, height = 200) 
frame.pack() 

colors = ['red','green', 'orange','blue'] 
color_gen = cycle(colors) 

def ChangeColor(): 
    frame.config(bg = next(color_gen)) 

btn = ttk.Button(frame, text = 'Change color', command = ChangeColor) 
btn.place (x = 80, y = 100) 

entry = ttk.Entry (frame, width = 20) 
entry.place(x = 80, y = 70) 

root.mainloop() 

一つのこと: "スター" の輸入をやって避けてください。あなたがするとき

from tkinter import * 

あなたの名前空間に135のTkinter名を入れます。 Python 2には175の名前があります。これは名前空間に不必要な混乱を引き起こし、名前の衝突を引き起こす可能性があります。間違ったバグにつながる可能性のあるインポートされた名前の1つで誤って変数の名前を付けた場合。複数のモジュールを使ってスターの読み込みを行うと、互いの名前を突き止めることができるので、さらに悪化します。また、星のインポートは、ローカルで定義された名前とインポートされた名前を覚えておく必要があるため、コードを読みにくくします。

+0

「スター」の輸入はワイルドカードの輸入と呼ばれています:) –

+0

@Coal_確かにそれらはありますが、「スターの輸入」という名前も非常に広く使用されており、容易に理解されています。そしてもっと短い。 ;) –

1

@PM 2Ringsの答えはきれいですが、私はこれに取り組んでいたので、私はあなたができるので、私はクラスにアプリを変更します手動

from tkinter import * 
from tkinter import ttk 

colors = ['red', 'green', 'orange', 'blue'] 
colors_it = iter(colors) 

def get_next_color(): 
    try: 
     global colors_it 
     return next(colors_it) 
    except StopIteration: 
     colors_it = iter(colors) 
     return next(colors_it) 

def ChangeColor(): 
    frame.config(bg=get_next_color()) 

root = Tk() 
root.title("Title") 

frame = Frame (root, width = 260, height = 200) 
frame.pack() 

btn = ttk.Button(frame, text = 'Change color', command = ChangeColor) 
btn.place (x = 80, y = 100) 

entry = ttk.Entry (frame, width = 20) 
entry.place(x = 80, y = 70) 

root.mainloop() 
2

をそれを実装したかった包み、私はまだそれを投稿しようと思いました変数を格納して簡単にアクセスできるようにするには、エンターキーを入力ウィジェットにバインドしてください。あなたがclass appinstanceを作成し、この方法は、それはTk()ルートのinstanceですが、

import tkinter as tk 
from tkinter import ttk 

class app(tk.Tk): 
    def __init__(self): 
     tk.Tk.__init__(self) 
     self.title("Title") 
     self.frame = tk.Frame(self, width = 260, height = 200) 
     self.frame.pack() 

     self.btn = ttk.Button(self.frame, text = 'Change color', command = self.ChangeColor) 
     self.btn.place (x = 80, y = 100) 

     self.entry = ttk.Entry (self.frame, width = 20) 
     self.entry.place(x = 80, y = 70) 
     self.entry.bind("<Return>",self.ChangeColorEntry) 

     self.colors = ['red','green','orange','blue'] 
     self.current_color = -1 
     self.standard_bg = self.frame['background'] 

    def ChangeColor(self,event=None): 
     if self.current_color == len(self.colors) - 1: 
      self.frame.config(bg = self.standard_bg) 
      self.current_color = -1 
      return 
     else: 
      self.current_color += 1 
     color = self.colors[self.current_color] 
     self.frame.config(bg = color) 

    def ChangeColorEntry(self,event=None): 
     entered = self.entry.get().lower().strip() 
     if entered == "none": 
      self.frame.config(bg = self.standard_bg) 
     else: 
      try: 
       self.current_color = self.colors.index(entered) 
       self.frame.config(bg = entered) 
      except: 
       pass 
関連する問題