我正在制作一个费用追踪器作为一个有趣的项目。我遇到了一个问题,我在框架类中使用的颜色选择方法不起作用,有人可以帮忙吗?
这是我的代码:
import tkinter as tk
from tkinter import ttk, colorchooser, messagebox
class ExpenseTracker(tk.Tk):
def __init__(self):
super().__init__()
self.title("Expense Tracker")
self.geometry("700x700")
self.minsize(700, 700)
self.login = Login(self)
self.mainloop()
class Login(tk.Frame):
def __init__(self, parent):
super().__init__(parent)
tk.Label(text="Enter Username:").place(relx=0.5, rely=0.36, anchor=tk.CENTER)
tk.Label(text="Enter Password:").place(relx=0.5, rely=0.46, anchor=tk.CENTER)
change_colour = tk.Button(text="Background Colour", command=self.change_colour)
change_colour.place(relx=0.9, rely=0.1, anchor=tk.CENTER)
username_entry = tk.Entry()
username_entry.place(relx=0.5, rely=0.4, anchor=tk.CENTER)
password_entry = tk.Entry()
password_entry.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
login_box = tk.Button(text="Login")
login_box.place(relx=0.5, rely=0.55, anchor=tk.CENTER)
self.grid()
def change_colour(self):
color = colorchooser.askcolor()[1]
self.configure(bg=color)
ExpenseTracker()
首先,登录类继承自“ttk.Frame”,我想要它,但我收到了“未知选项“-bg””错误。然后,我将其更改为从“tk.Frame”继承,这阻止了错误的发生,但当我使用更改颜色按钮时背景仍然没有改变。
您最初遇到错误是因为 ttk.Frame 不支持使用 bg 选项更改背景颜色。切换到 tk.Frame 解决了这个问题,因为它支持直接背景定制。
您使用不带参数的 self.grid() 可能无法正确调整或显示登录框架。考虑使用 self.pack(expand=True, fill=tk.BOTH) 以获得更好的控制和可见性。
change_colour 函数仅更改框架的背景,而不更改其上的小部件。为了统一改变颜色,你必须在改变颜色时手动设置框架内每个小部件的背景。
这是您的 Login 类的更新版本,它解决了这些问题:
import tkinter as tk
from tkinter import ttk, colorchooser, messagebox
class ExpenseTracker(tk.Tk):
def __init__(self):
super().__init__()
self.title("Expense Tracker")
self.geometry("700x700")
self.minsize(700, 700)
self.login = Login(self)
self.mainloop()
class Login(tk.Frame):
def __init__(self, parent):
super().__init__(parent, bg='white') # Set default background color
self.pack(expand=True, fill=tk.BOTH) # Use pack with expand and fill for proper sizing
tk.Label(self, text="Enter Username:", bg='white').place(relx=0.5, rely=0.36, anchor=tk.CENTER)
tk.Label(self, text="Enter Password:", bg='white').place(relx=0.5, rely=0.46, anchor=tk.CENTER)
self.change_colour_btn = tk.Button(self, text="Background Colour", command=self.change_colour)
self.change_colour_btn.place(relx=0.9, rely=0.1, anchor=tk.CENTER)
self.username_entry = tk.Entry(self)
self.username_entry.place(relx=0.5, rely=0.4, anchor=tk.CENTER)
self.password_entry = tk.Entry(self)
self.password_entry.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
self.login_box = tk.Button(self, text="Login")
self.login_box.place(relx=0.5, rely=0.55, anchor=tk.CENTER)
def change_colour(self):
color = colorchooser.askcolor()[1]
if color: # Check if a color was actually selected
self.configure(bg=color) # Change the background of the frame
# Also change the background of all widgets
for widget in [self, self.change_colour_btn, self.username_entry, self.password_entry, self.login_box]:
widget.configure(bg=color)
ExpenseTracker()
框架使用 pack(expand=True, fill=tk.BOTH) 填充整个父窗口。当您选择新颜色时,框架上的所有小部件都将更改其背景颜色以及框架本身。它处理用户可能通过在尝试更改背景颜色之前检查颜色是否不是 None 来取消颜色对话框的情况。
希望这有帮助:)