Tkinter Askcolor 函数不会更改框架的背景颜色

问题描述 投票:0回答:1

我正在制作一个费用追踪器作为一个有趣的项目。我遇到了一个问题,我在框架类中使用的颜色选择方法不起作用,有人可以帮忙吗?

这是我的代码:

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”继承,这阻止了错误的发生,但当我使用更改颜色按钮时背景仍然没有改变。

python tkinter
1个回答
0
投票

您最初遇到错误是因为 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 来取消颜色对话框的情况。

希望这有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.