Вопрос:
У меня есть следующий фрагмент кода. Что мне нужно для кода, когда я нажимаю кнопку, мне нужно, чтобы цвет рамки менялся один за другим из списка цветов.
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() Лучший ответ:
Для этого вы можете использовать итератор cycle из itertools.
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
Я бы сменил ваше приложение на класс, чтобы вы могли легко хранить переменные и получать доступ к ним, а также привязывал ключ ввода к виджету ввода, чтобы он тоже работал. Таким образом, когда вы создаете instance class app он является instance корня Tk(), но вам не нужно называть его root
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 Ответ №2
@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()