原文: http://zetcode.com/tkinter/attributes/

在 Tkinter 教程的这一部分中,我们讨论标准的窗口小部件属性,包括光标,浮雕,颜色和字体。

标准窗口小部件属性是在窗口小部件构造器中使用的关键字。

Tkinter 小部件状态

state属性定义窗口小部件的状态。 它可以具有以下值:NORMALACTIVEDISABLED

widget_states.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. In this script, we use the state attribute.
  5. Author: Jan Bodnar
  6. Last modified: April 2019
  7. Website: www.zetcode.com
  8. """
  9. from tkinter import Tk, BOTH, NORMAL, ACTIVE, DISABLED
  10. from tkinter.ttk import Frame, Label
  11. class Example(Frame):
  12. def __init__(self):
  13. super().__init__()
  14. self.initUI()
  15. def initUI(self):
  16. self.master.title("Fonts")
  17. self.pack(fill=BOTH, expand=True)
  18. self.columnconfigure(0, pad=5)
  19. self.columnconfigure(1, pad=5)
  20. self.columnconfigure(2, pad=5)
  21. txt = "Today is a beautiful day"
  22. label1 = Label(self, text=txt, state=NORMAL)
  23. label1.grid(row=0, column=0)
  24. label2 = Label(self, text=txt, state=ACTIVE)
  25. label2.grid(row=0, column=1)
  26. label3 = Label(self, text=txt, state=DISABLED)
  27. label3.grid(row=0, column=2)
  28. def main():
  29. root = Tk()
  30. ex = Example()
  31. root.geometry("+300+300")
  32. root.mainloop()
  33. if __name__ == '__main__':
  34. main()

我们在Label小部件上演示state属性。

  1. label1 = Label(self, text=txt, state=NORMAL)

第一个标签具有NORMAL状态。

Tkinter 标准小部件属性 - 图1

图:小部件状态

Tkinter 小部件填充

padxpady属性为小部件添加了额外的水平和垂直空间。

padding.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. This program uses the padx and pady
  5. widget attributes.
  6. Author: Jan Bodnar
  7. Last modified: April 2019
  8. Website: www.zetcode.com
  9. """
  10. from tkinter import Tk, Frame, Button
  11. from tkinter import BOTH, LEFT, TOP
  12. class Example(Frame):
  13. def __init__(self):
  14. super().__init__()
  15. self.initUI()
  16. def initUI(self):
  17. self.master.title("Padding")
  18. self.pack(fill=BOTH)
  19. frame = Frame(self, bd=5)
  20. frame.pack()
  21. btn1 = Button(frame, text='Button')
  22. btn1.pack(side=LEFT, padx=5)
  23. btn2 = Button(frame, text='Button')
  24. btn2.pack(side=LEFT, padx=5)
  25. frame2 = Frame(self)
  26. frame2.pack()
  27. btn1 = Button(frame2, text='Button')
  28. btn1.pack(side=TOP, pady=15)
  29. btn2 = Button(frame2, text='Button')
  30. btn2.pack(side=TOP, pady=15)
  31. self.pack()
  32. def main():
  33. root = Tk()
  34. root.geometry("300x250+300+300")
  35. app = Example()
  36. root.mainloop()
  37. if __name__ == '__main__':
  38. main()

在示例中,我们创建了两个框架; 他们每个人都有两个小部件。 第一个框架从按钮形成一行,第二个框架从列形成一行。 padxpady属性在按钮之间添加空格。

  1. btn1 = Button(frame, text='Button')
  2. btn1.pack(side=LEFT, padx=5)

使用pack管理器,我们创建了一行按钮。 padx在按钮之间水平增加 5px 的间距。

  1. btn1 = Button(frame2, text='Button')
  2. btn1.pack(side=TOP, pady=15)

在这里,我们形成一列。 因此,我们使用pady属性垂直添加空间。

Tkinter 标准小部件属性 - 图2

图:填充

背景颜色

窗口小部件的背景色可以使用background属性设置。 可以缩写为bg

同样,可以使用foreground属性设置窗口小部件的前景色。 可以缩写为fg

bg_colours.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. This program uses sets various background
  5. colours with bg attribute.
  6. Author: Jan Bodnar
  7. Last modified: April 2019
  8. Website: www.zetcode.com
  9. """
  10. from tkinter import Tk, Frame, Label
  11. from tkinter import BOTH, LEFT
  12. class Example(Frame):
  13. def __init__(self):
  14. super().__init__()
  15. self.initUI()
  16. def initUI(self):
  17. self.master.title("Background colours")
  18. self.pack(fill=BOTH)
  19. frame = Frame(self, borderwidth=10)
  20. frame.pack()
  21. lbl1 = Label(frame, bg='SlateGray3', width=15, height=10)
  22. lbl1.pack(side=LEFT, padx=3)
  23. lbl2 = Label(frame, bg='SlateGray4', width=15, height=10)
  24. lbl2.pack(side=LEFT)
  25. lbl3 = Label(frame, bg='DarkSeaGreen3', width=15, height=10)
  26. lbl3.pack(side=LEFT, padx=3)
  27. lbl4 = Label(frame, bg='DarkSeaGreen4', width=15, height=10)
  28. lbl4.pack(side=LEFT)
  29. self.pack()
  30. def main():
  31. root = Tk()
  32. root.geometry("+300+300")
  33. app = Example()
  34. root.mainloop()
  35. if __name__ == '__main__':
  36. main()

在代码示例中,我们创建具有四个不同背景颜色的四个标签。

  1. lbl1 = Label(frame, bg='SlateGray3', width=15, height=10)
  2. lbl1.pack(side=LEFT, padx=3)

第一个标签具有SlateGray3背景色。

Tkinter 标准小部件属性 - 图3

图:背景色

宽度和高度

widthheight属性设置窗口小部件的宽度和高度。

width_height.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. This program uses width and height
  5. attributes to set the size of widgets.
  6. Author: Jan Bodnar
  7. Last modified: April 2019
  8. Website: www.zetcode.com
  9. """
  10. from tkinter import Tk, Frame, Button
  11. from tkinter import BOTH, LEFT
  12. class Example(Frame):
  13. def __init__(self):
  14. super().__init__()
  15. self.initUI()
  16. def initUI(self):
  17. self.master.title("Width and height")
  18. self.pack(fill=BOTH)
  19. frame = Frame(self, borderwidth=10)
  20. frame.pack()
  21. btn1 = Button(frame, text='Button')
  22. btn1.pack(side=LEFT, padx=5)
  23. btn2 = Button(frame, text='Button', width=8)
  24. btn2.pack(side=LEFT, padx=5)
  25. btn3 = Button(frame, text='Button', width=5, height=4)
  26. btn3.pack(side=LEFT)
  27. self.pack()
  28. def main():
  29. root = Tk()
  30. root.geometry("+300+300")
  31. app = Example()
  32. root.mainloop()
  33. if __name__ == '__main__':
  34. main()

在示例中,我们使用widthheight.控制按钮的大小

  1. btn2 = Button(frame, text='Button', width=8)

此按钮的宽度设置为八个字符。

Tkinter 标准小部件属性 - 图4

图:宽高属性

Tkinter 浮雕

浮雕是一种边界装饰。 可能的值为:SUNKENRAISEDGROOVERIDGEFLAT

reliefs.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. This program uses relief styles.
  5. Author: Jan Bodnar
  6. Last modified: April 2019
  7. Website: www.zetcode.com
  8. """
  9. from tkinter import Tk, Frame, Label
  10. from tkinter import BOTH, LEFT, FLAT, SUNKEN, RAISED, GROOVE, RIDGE
  11. class Example(Frame):
  12. def __init__(self):
  13. super().__init__()
  14. self.initUI()
  15. def initUI(self):
  16. self.master.title("Reliefs")
  17. self.pack(fill=BOTH)
  18. frame = Frame(self, borderwidth=10)
  19. frame.pack()
  20. lbl1 = Label(frame, bg='LightSteelBlue3', width=15, height=10, relief=FLAT)
  21. lbl1.pack(side=LEFT, padx=3)
  22. lbl2 = Label(frame, bg='LightSteelBlue3', bd=2, width=15,
  23. height=10, relief=SUNKEN)
  24. lbl2.pack(side=LEFT)
  25. lbl3 = Label(frame, bg='LightSteelBlue3', bd=2, width=15,
  26. height=10, relief=RAISED)
  27. lbl3.pack(side=LEFT, padx=3)
  28. lbl4 = Label(frame, bg='LightSteelBlue3', bd=3, width=15,
  29. height=10, relief=GROOVE)
  30. lbl4.pack(side=LEFT)
  31. lbl5 = Label(frame, bg='LightSteelBlue3', bd=3, width=15,
  32. height=10, relief=RIDGE)
  33. lbl5.pack(side=LEFT, padx=3)
  34. self.pack()
  35. def main():
  36. root = Tk()
  37. root.geometry("+300+300")
  38. app = Example()
  39. root.mainloop()
  40. if __name__ == '__main__':
  41. main()

该示例显示了应用于标签的五种不同的凸版。

  1. lbl3 = Label(frame, bg='LightSteelBlue3', bd=2, width=15,
  2. height=10, relief=RAISED)

第三个标签具有RAISED浮雕。 使用bd,我们增加了边框宽度,以使浮雕更加明显。

Tkinter 标准小部件属性 - 图5

图:浮雕

Tkinter 字体

Tkinter 具有用于处理字体的tkinter.font模块。 它具有一些内置字体,例如TkTooltipFontTkDefaultFontTkTextFont。 字体通过font属性设置。

fonts.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. In this script, we display text in three
  5. different fonts.
  6. Author: Jan Bodnar
  7. Last modified: April 2019
  8. Website: www.zetcode.com
  9. """
  10. from tkinter import Tk, BOTH
  11. from tkinter.ttk import Frame, Label, Notebook, Style
  12. from tkinter.font import Font
  13. class Example(Frame):
  14. def __init__(self):
  15. super().__init__()
  16. self.initUI()
  17. def initUI(self):
  18. self.master.title("Fonts")
  19. self.pack(fill=BOTH, expand=True)
  20. txt = "Today is a beautiful day"
  21. myfont = Font(family="Ubuntu Mono", size=16)
  22. label1 = Label(self, text=txt, font=myfont)
  23. label1.grid(row=0, column=0)
  24. label2 = Label(self, text=txt, font="TkTextFont")
  25. label2.grid(row=1, column=0)
  26. label3 = Label(self, text=txt, font=('Times', '18', 'italic'))
  27. label3.grid(row=2, column=0)
  28. def main():
  29. root = Tk()
  30. ex = Example()
  31. root.geometry("+300+300")
  32. root.mainloop()
  33. if __name__ == '__main__':
  34. main()

该示例显示了三个带有三种不同字体的文本标签。

  1. myfont = Font(family="Ubuntu Mono", size=16)
  2. label1 = Label(self, text=txt, font=myfont)

使用Font类创建特定的字体。 如果该字体在平台上不可用,则 Tkinter 会还原为某些默认字体。

  1. label2 = Label(self, text=txt, font="TkTextFont")

在这里,我们使用内置字体名称。

  1. label3 = Label(self, text=txt, font=('Times', '18', 'italic'))

字体也可以指定为字符串元组。

Tkinter 标准小部件属性 - 图6

图:Tkinter 字体

Tkinter 光标

光标是一个小图标,显示鼠标指针所在的位置。 使用cursor属性设置 Tkinter 中的光标。

cursors.py

  1. #!/usr/bin/env python3
  2. """
  3. ZetCode Tkinter tutorial
  4. This program uses different cursors.
  5. Author: Jan Bodnar
  6. Last modified: April 2019
  7. Website: www.zetcode.com
  8. """
  9. from tkinter import Tk, Frame, Label
  10. from tkinter import BOTH, LEFT
  11. class Example(Frame):
  12. def __init__(self):
  13. super().__init__()
  14. self.initUI()
  15. def initUI(self):
  16. self.master.title("Cursors")
  17. self.pack(fill=BOTH)
  18. frame = Frame(self, borderwidth=10)
  19. frame.pack()
  20. lbl1 = Label(frame, bg='SlateGray3', width=15, height=10,
  21. cursor='tcross')
  22. lbl1.pack(side=LEFT, padx=3)
  23. lbl2 = Label(frame, bg='SlateGray4', width=15, height=10,
  24. cursor='hand2')
  25. lbl2.pack(side=LEFT)
  26. lbl3 = Label(frame, bg='DarkSeaGreen3', width=15, height=10,
  27. cursor='heart')
  28. lbl3.pack(side=LEFT, padx=3)
  29. lbl4 = Label(frame, bg='DarkSeaGreen4', width=15, height=10,
  30. cursor='pencil')
  31. lbl4.pack(side=LEFT)
  32. self.pack()
  33. def main():
  34. root = Tk()
  35. root.geometry("+300+300")
  36. app = Example()
  37. root.mainloop()
  38. if __name__ == '__main__':
  39. main()

在示例中,我们有四个标签。 每个标签使用不同的光标。

  1. lbl4 = Label(frame, bg='DarkSeaGreen4', width=15, height=10,
  2. cursor='pencil')

第四个标签有一个用于光标的铅笔图标。

在 Tkinter 教程的这一部分中,我们使用了标准的窗口小部件属性。