python 更改菜单栏和标题栏的颜色

col17t5w  于 2023-01-29  发布在  Python
关注(0)|答案(1)|浏览(304)

我想更改菜单栏的颜色和标题的颜色。
这是我想要的例子。

有可能吗?

kknvjkwl

kknvjkwl1#

举一个例子来说明你正在尝试做什么:

import tkinter as tk
from tkinter import ttk

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("400x200")
        self.configure(background='black')
        self.overrideredirect(1)
        self.attributes("-topmost", True)
        
    def startMove(self,event):
        self.x = event.x
        self.y = event.y

    def stopMove(self,event):
        self.x = None
        self.y = None

    def moving(self,event):
        x = (event.x_root - self.x)
        y = (event.y_root - self.y)
        self.geometry("+%s+%s" % (x, y))

    def exit(self):
        self.destroy()

def save():
    print ('save')
    return None
def add():
    print('add')
    return None

  

class MenuBar(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master, bd=1, relief='raised')
        self.master=master
        self.configure(background='black',
                       cursor='hand2')

        file = tk.Menubutton(self, text='File',
                             background='black',
                             foreground='white',
                             activeforeground='black',
                             activebackground='white'
                             )
        file_menu = tk.Menu(file,tearoff=0)
        file_menu.add_command(label='save', command=save,
                              background='black',
                              foreground='white',
                              activeforeground='black',
                              activebackground='white'
                              )
        
        file.config(menu=file_menu)
        file.pack(side='left')

        edit = tk.Menubutton(self, text='Edit',
                             background='black',
                             foreground='white',
                             activeforeground='black',
                             activebackground='white'
                             )
        edit_menu = tk.Menu(edit,tearoff=0)
        edit_menu.add_command(label='add', command=add,
                              background='black',
                              foreground='white',
                              activeforeground='black',
                              activebackground='white'
                              )

        edit.config(menu=edit_menu)
        edit.pack(side='left')

        close = tk.Button(self, text='X', command=lambda:root.exit(),
                          background='black',
                          foreground='white')
        close.pack(side='right')

def show():
    print('show')
    return None
def ex_it():
    print('exit')
    return None

class MainFrame(tk.LabelFrame):
    def __init__(self, master=None):
        tk.LabelFrame.__init__(self, master, bd=1, relief='raised', text='MainFrame', background='black', foreground='white')
        self.master=master
        self.note = tk.Label(self, text='Your typed chars appear here:',
                             background='black',
                             foreground='white',
                             )
        self.note.grid(column=0, row=0, columnspan=2, sticky='w')
        self.entry = ttk.Entry(self, style='My.TEntry')
        self.entry.grid(column=0,row=1,columnspan=3, sticky='ew')
        self.columnconfigure(0, weight=1)
        self.b_frame=tk.Frame(self, bg='black')
        self.b_frame.grid(column=0,row=2,sticky='w')
        self.sh_b = tk.Button(self.b_frame, text='Show', command=show)
        self.ex_b = tk.Button(self.b_frame, text='Exit', command=ex_it)
        self.sh_b.grid(column=0, row=0, sticky='w')
        self.ex_b.grid(column=1, row=0, sticky='w', padx=5)

root = App()

menubar = MenuBar(root)
menubar.pack(side='top', fill='x')

mainframe = MainFrame(root)
mainframe.pack(fill='both', expand=1)

menubar.bind("<Button-1>", root.startMove)
menubar.bind("<ButtonRelease-1>", root.stopMove)
menubar.bind("<B1-Motion>", root.moving)

style = ttk.Style(root)
style.element_create("plain.field", "from", "clam")
style.layout("My.TEntry",
             [('Entry.plain.field', {'children': [(
                 'Entry.background', {'children': [(
                     'Entry.padding', {'children': [(
                         'Entry.textarea', {'sticky': 'nswe'})],
                                       'sticky': 'nswe'})], 'sticky': 'nswe'})],
                                     'border':'2', 'sticky': 'nswe'})])
style.configure("My.TEntry",
                 foreground="white",
                 fieldbackground="grey")

root.mainloop()

玩得开心点!

解释

首先,我使用类创建了3个对象,它们看起来像这样:
从Tk()吸入的应用程序/窗口

class App(tk.Tk):
    def __init__(self):
        super().__init__()

然后是从框架中嵌入的菜单栏,看起来像:

class MenuBar(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master, bd=1, relief='raised')

以及从tkinter的LabeFrame类中继承的MainFrame:

class MainFrame(tk.LabelFrame):
    def __init__(self, master=None):
        tk.LabelFrame.__init__(self, master, bd=1, relief='raised', text='MainFrame', background='black', foreground='white')

了解有关类和init方法的更多信息click(https://micropyramid.com/blog/understand-self-and-init-method-in-python-class/)了解语法self.click(https://stackoverflow.com/a/2709832/13629335)
下面我们来仔细看看这款App:

self.geometry("400x200")
self.configure(background='black')
self.overrideredirect(1)
self.attributes("-topmost", True)
  • 利用几何方法,我们以像素为单位定义width=400height=200
  • 然后我们用以下行配置背景:
self.configure(background='black')
  • 在此之后,我们使用tkinter的overriderirect方法,这显然是:

设置或获取覆盖重定向标志。如果不为零,这将阻止窗口管理器装饰窗口。换句话说,窗口将没有标题或边框,并且不能通过普通方式移动或关闭。

  • 最后,我们使用属性方法来处理Toplevels,并将参数topmost设置为true。

(Windows)如果设置,则此窗口始终位于其他窗口的顶部。请注意,在此发行版中,此属性必须指定为"-topmost"。
使用overriderirect后最大的问题是你不能再移动你的窗口了,因为窗口管理器的边框/标题-或者菜单栏都没有了。所以我们需要自己使用这段代码来实现它:

def startMove(self,event):
    self.x = event.x
    self.y = event.y

def stopMove(self,event):
    self.x = None
    self.y = None

def moving(self,event):
    x = (event.x_root - self.x)
    y = (event.y_root - self.y)
    self.geometry("+%s+%s" % (x, y))

这段代码所做的是通过使用event manger命令单击/Button-1来获取当前鼠标位置
事件x或事件y表示:
当前鼠标位置,以像素为单位。
事件. x_根或事件. y_根表示:
相对于屏幕左上角的当前鼠标位置(以像素为单位)。
通过从一个中减去另一个,我们得到偏移,我们需要几何方法来"移动"。

相关问题