tkinter 之窗口设计

tkinter 之窗口设计#

我们以 win 表示窗口,则有:

  1. win.attributes("-alpha", value): 设定透明度,value取值范围是 \([0, 1]\)。其中 \(0\) 表示完全透明,\(1\) 表示完全不透明。

  2. win.winfo_width():窗口的宽度

  3. win.winfo_height():窗口的高度

  4. win.geometry("300x300+150+150"):设置窗体的大小(\(300\times 300\)),与出现的位置距离窗体左上角(\(+150+150\)

  5. win.title("标题"):设置标题

  6. win["background"] = "blue":设置背景色为“蓝色”

  7. win.attributes("-toolwindow", True):设置工具栏样式,其中 True 只有退出按钮,也没有图标; False 正常的窗体样式

  8. win.attributes("-fullscreen", True):全屏模式。其中 True 全屏;False 正常显示

  9. win.attributes("-topmost", 1):设置窗体置顶。1 设置顶层窗口,覆盖其它窗口。;0 正常显示,允许其它窗口覆盖

  10. win.overrideredirect(True):设置成脱离工具栏。True 没有工具栏按钮;False 正常显示

案例1:

import tkinter as tk
# 实例化一个窗体对象
win = tk.Tk()
# 设置窗体的大小(300x300),与出现的位置距离窗体左上角(+150+150)
win.geometry("300x300+150+150")
# 设置标题
win.title("标题")
# 设置图标,以QQ头为例
win.iconbitmap("app.ico")
# 设置背景色,以“蓝色”为例
win["background"] = "blue"
# 设置透明度
win.attributes("-alpha", 0.6)
# 设置窗口为工具样式:
win.attributes("-toolwindow", True)
# # 设置全屏:
win.attributes("-fullscreen", False)
# 设置窗体置顶
win.attributes("-topmost", True)
# 设置成脱离工具栏
win.overrideredirect(False)
# 进入消息循环,显示窗体
win.mainloop()

窗口的三个常用方法#

  1. 获取屏幕的大小

win = Tk()
# 获取屏幕的大小;
screen_height = win.winfo_screenheight()
screen_width = win.winfo_screenwidth()
print("你电脑的屏幕的高度是:", screen_height)
print("你电脑的屏幕的宽度度是:", screen_width)
win.mainloop()
  1. 获取窗体的大小

需要注意的是:要用 update() 方法,才能看到更新后的数值:

win = Tk()
win.geometry("600x500")
# 更新窗体
win.update()
# 获取屏幕的大小;
win_height = win.winfo_height()
win_width = win.winfo_width()
print("控件的高度是:", win_height)
print("控件的宽度度是:", win_width)
win.mainloop()
  1. 获取窗体的位置

win = Tk()
win.geometry("600x500")
def change(event):
    win.update()
    # 获取窗体的位置
    win_x = win.winfo_x()
    win_y = win.winfo_y()
    print(win_x, win_y)

# 绑定事件,窗体的改变事件
win.bind("<Configure>", change)
win.mainloop()

当用鼠标拖动窗体时,更新了一系列的位置数值

tkinter 弹窗#

参考:https://www.jb51.net/article/119817.htm

可以利用 tkinter 提供的弹窗函数:

::tk_popup --
This procedure pops up a menu and sets things up for traversing
the menu and its submenus.

Arguments:
menu  - Name of the menu to be popped up.
x, y  - Root coordinates at which to pop up the menu.  
entry - Index of a menu entry to center over (x,y).  
        If omitted or specified as {}, then menu's  
        upper-left corner goes at (x,y).  

def tk_popup(self, x, y, entry=""):
    """Post the menu at position X,Y with entry ENTRY."""
    self.tk.call('tk_popup', self._w, x, y, entry)

代码示例:

from tkinter import ttk, Tk, Menu


class App(Tk):
    def __init__(self):
        super().__init__()
        self.popup = self.create_menu()
        w = ttk.Label(self, text="Right-click to display menu", width=40)
        w.pack()
        w.bind("<Button-3>", self.do_popup)
        b = ttk.Button(self, text="Quit", command=self.destroy)
        b.pack()

    def create_menu(self):
        popup = Menu(self, tearoff=0)
        popup.add_command(label="Next") # , command=next) etc...
        popup.add_command(label="Previous")
        popup.add_separator()
        popup.add_command(label="Home")
        return popup

    def do_popup(self, event):
        # display the popup menu
        try:
            self.popup.tk_popup(event.x_root, event.y_root, entry=0)
            #popup.post(event.x, event.y)
        finally:
            # make sure to release the grab (Tk 8.0a1 only)
            self.popup.grab_release()

if __name__ == '__main__':
    root = App()
    root.mainloop()

不同的 entry 显示不同的效果:

entry=0

entry=10