当前位置:   article > 正文

Tkinter (python自带界面库)_tkinter库

tkinter库

1. 介绍

Tkinter库是什么

Tkinter是Python的标准GUI库,它提供了丰富的组件和布局管理器,能够帮助我们快速地创建图形用户界面应用程序。

为什么使用Tkinter库

Tkinter库具有以下优点:

  • 它是Python的标准GUI库,无需安装第三方库即可使用。
  • 它提供了丰富的组件和布局管理器,能够满足大多数应用程序的需求。
  • 它具有良好的跨平台性,能够在Windows、macOS和Linux等操作系统上运行。

2. 安装和设置

如何安装Tkinter库

由于Tkinter是Python的标准GUI库,因此在安装Python时已经自动安装了Tkinter库,无需再进行额外的安装。

如何在项目中导入Tkinter库

在项目中使用Tkinter库时,只需在代码开头导入Tkinter模块即可。需要注意的是,在Python 2.x中,模块名为Tkinter(首字母大写),而在Python 3.x中,模块名为tkinter(首字母小写)。

  1. # Python 2.x
  2. import Tkinter as tk
  3. # Python 3.x
  4. import tkinter as tk

3. Tkinter基础

Tkinter窗口和组件

在Tkinter中,窗口和组件都是对象。我们可以创建一个窗口对象,并在其中添加各种组件对象。

下面是一个简单的例子,它创建了一个窗口,并在其中添加了一个标签组件和一个按钮组件:

  1. import tkinter as tk
  2. # 创建窗口对象
  3. window = tk.Tk()
  4. # 创建标签组件
  5. label = tk.Label(window, text="Hello, Tkinter!")
  6. label.pack()
  7. # 创建按钮组件
  8. button = tk.Button(window, text="Click me!")
  9. button.pack()
  10. # 运行主循环
  11. window.mainloop()

上面的代码中,我们首先导入了tkinter模块,并创建了一个窗口对象window。然后,我们创建了一个标签组件label和一个按钮组件button,并使用pack()方法将它们添加到窗口中。最后,我们调用窗口对象的mainloop()方法来运行主循环。

运行上面的代码后,会弹出一个窗口,其中包含一个标签和一个按钮。

布局管理器

在Tkinter中,布局管理器负责管理组件的位置和大小。目前,Tkinter提供了三种布局管理器:pack、grid和place。

  • pack布局管理器:按照添加顺序将组件放置到窗口中。
  • grid布局管理器:将窗口划分为网格,并将组件放置到指定的网格中。
  • place布局管理器:允许开发者精确地控制组件的位置和大小。

下面是一个使用grid布局管理器的例子:

  1. import tkinter as tk
  2. # 创建窗口对象
  3. window = tk.Tk()
  4. # 创建标签组件
  5. label = tk.Label(window, text="Hello, Tkinter!")
  6. label.grid(row=0, column=0)
  7. # 创建按钮组件
  8. button = tk.Button(window, text="Click me!")
  9. button.grid(row=1, column=0)
  10. # 运行主循环
  11. window.mainloop()

上面的代码中,我们使用grid()方法来指定组件的位置。例如,label.grid(row=0, column=0)表示将标签组件放置到第0行第0列的位置。

运行上面的代码后,会弹出一个窗口,其中包含一个标签和一个按钮,它们分别位于第0行第0列和第1行第0列的位置。

4. Tkinter组件详解

Tkinter库提供了丰富的组件,能够满足大多数应用程序的需求。下面我们将详细介绍常用的几种组件。

按钮(Button)

按钮组件用于在应用程序中添加按钮。按钮上可以显示文本或图像,并且可以与一个回调函数关联,当用户点击按钮时,自动调用该回调函数。

下面是一个简单的例子,它创建了一个按钮,并在用户点击按钮时弹出一个消息框:

  1. import tkinter as tk
  2. from tkinter import messagebox
  3. def on_button_click():
  4. messagebox.showinfo("Message", "Hello, Tkinter!")
  5. # 创建窗口对象
  6. window = tk.Tk()
  7. # 创建按钮组件
  8. button = tk.Button(window, text="Click me!", command=on_button_click)
  9. button.pack()
  10. # 运行主循环
  11. window.mainloop()

上面的代码中,我们定义了一个回调函数on_button_click(),并在创建按钮组件时使用command参数将其与按钮关联。当用户点击按钮时,自动调用该回调函数。

运行上面的代码后,会弹出一个窗口,其中包含一个按钮。当用户点击该按钮时,会弹出一个消息框。

复选按钮(Checkbutton)

复选按钮组件用于在应用程序中添加复选框。复选框可以显示文本或图像,并且可以与一个布尔变量关联,当用户选中或取消选中复选框时,自动更新该布尔变量的值。

下面是一个简单的例子,它创建了两个复选框,并在用户选中或取消选中复选框时更新布尔变量的值:

  1. import tkinter as tk
  2. def on_checkbutton_click():
  3. print(var1.get(), var2.get())
  4. # 创建窗口对象
  5. window = tk.Tk()
  6. # 创建布尔变量
  7. var1 = tk.BooleanVar()
  8. var2 = tk.BooleanVar()
  9. # 创建复选按钮组件
  10. checkbutton1 = tk.Checkbutton(window, text="Option 1", variable=var1, command=on_checkbutton_click)
  11. checkbutton1.pack()
  12. checkbutton2 = tk.Checkbutton(window, text="Option 2", variable=var2, command=on_checkbutton_click)
  13. checkbutton2.pack()
  14. # 运行主循环
  15. window.mainloop()

上面的代码中,我们创建了两个布尔变量var1var2,并在创建复选框组件时使用variable参数将它们与复选框关联。当用户选中或取消选中复选框时,自动更新布尔变量的值。

运行上面的代码后,会弹出一个窗口,其中包含两个复选框。当用户选中或取消选中复选框时,会在控制台中打印出布尔变量的值。

画布(Canvas)

画布组件用于在应用程序中绘制图形和文本。画布支持多种绘图方法,如绘制直线、矩形、椭圆和文本等。

下面是一个简单的例子,它创建了一个画布,并在其中绘制了一条直线、一个矩形和一段文本:

  1. import tkinter as tk
  2. # 创建窗口对象
  3. window = tk.Tk()
  4. # 创建画布组件
  5. canvas = tk.Canvas(window, width=300, height=200)
  6. canvas.pack()
  7. # 绘制直线
  8. canvas.create_line(0, 0, 300, 200, fill="red")
  9. # 绘制矩形
  10. canvas.create_rectangle(50, 50, 250, 150, fill="blue")
  11. # 绘制文本
  12. canvas.create_text(150, 100, text="Hello, Tkinter!", fill="white")
  13. # 运行主循环
  14. window.mainloop()

上面的代码中,我们创建了一个画布组件canvas,并使用create_line()create_rectangle()create_text()方法在画布上绘制直线、矩形和文本。

运行上面的代码后,会弹出一个窗口,其中包含一个画布。画布上绘制了一条直线、一个矩形和一段文本。

条目(Entry)

条目组件用于在应用程序中添加单行文本输入框。条目组件可以与一个字符串变量关联,当用户在条目组件中输入文本时,自动更新该字符串变量的值。

下面是一个简单的例子,它创建了一个条目组件,并在用户在条目组件中输入文本时更新字符串变量的值:

  1. import tkinter as tk
  2. def on_entry_change(sv):
  3. print(sv.get())
  4. # 创建窗口对象
  5. window = tk.Tk()
  6. # 创建字符串变量
  7. sv = tk.StringVar()
  8. sv.trace("w", lambda name, index, mode, sv=sv: on_entry_change(sv))
  9. # 创建条目组件
  10. entry = tk.Entry(window, textvariable=sv)
  11. entry.pack()
  12. # 运行主循环
  13. window.mainloop()

上面的代码中,我们创建了一个字符串变量sv,并使用trace()方法来监听该变量的变化。当该变量的值发生变化时,自动调用回调函数on_entry_change()

然后,我们创建了一个条目组件entry,并使用textvariable参数将其与字符串变量关联。当用户在条目组件中输入文本时,自动更新字符串变量的值。

运行上面的代码后,会弹出一个窗口,其中包含一个条目组件。当用户在条目组件中输入文本时,会在控制台中打印出字符串变量的值。

框架(Frame)

框架组件用于在应用程序中添加矩形区域,通常用作容器来管理其他组件。框架组件可以嵌套使用,以创建复杂的布局。

下面是一个简单的例子,它创建了两个框架,并在其中添加了标签和按钮组件:

  1. import tkinter as tk
  2. # 创建窗口对象
  3. window = tk.Tk()
  4. # 创建框架1
  5. frame1 = tk.Frame(window, bg="red", width=200, height=100)
  6. frame1.pack(fill="both", expand=True)
  7. # 在框架1中添加标签
  8. label = tk.Label(frame1, text="Hello, Tkinter!")
  9. label.pack()
  10. # 创建框架2
  11. frame2 = tk.Frame(window, bg="blue", width=200, height=100)
  12. frame2.pack(fill="both", expand=True)
  13. # 在框架2中添加按钮
  14. button = tk.Button(frame2, text="Click me!")
  15. button.pack()
  16. # 运行主循环
  17. window.mainloop()

上面的代码中,我们创建了两个框架组件frame1frame2,并使用pack()方法将它们添加到窗口中。然后,在框架1中添加了一个标签组件,在框架2中添加了一个按钮组件。

运行上面的代码后,会弹出一个窗口,其中包含两个框架。框架1的背景色为红色,并包含一个标签;框架2的背景色为蓝色,并包含一个按钮。

5. 实例应用

下面我们将通过两个实例应用来展示如何使用Tkinter库。

一个简单的Tkinter计算器应用程序

下面是一个简单的Tkinter计算器应用程序,它能够进行简单的加减乘除运算:

  1. import tkinter as tk
  2. class Calculator:
  3. def __init__(self, master):
  4. self.master = master
  5. self.master.title("Calculator")
  6. # 显示器
  7. self.result = tk.StringVar()
  8. self.result.set(0)
  9. self.result_label = tk.Label(self.master, textvariable=self.result, font=("Arial", 18), width=20, anchor="e")
  10. self.result_label.grid(row=0, column=0, columnspan=4)
  11. # 数字按钮
  12. self.create_button("7", 1, 0)
  13. self.create_button("8", 1, 1)
  14. self.create_button("9", 1, 2)
  15. self.create_button("4", 2, 0)
  16. self.create_button("5", 2, 1)
  17. self.create_button("6", 2, 2)
  18. self.create_button("1", 3, 0)
  19. self.create_button("2", 3, 1)
  20. self.create_button("3", 3, 2)
  21. self.create_button("0", 4, 1)
  22. # 运算符按钮
  23. self.create_button("+", 1, 3)
  24. self.create_button("-", 2, 3)
  25. self.create_button("*", 3, 3)
  26. self.create_button("/", 4, 3)
  27. # 其他按钮
  28. self.create_button(".", 4, 0)
  29. self.create_button("C", 4, 2)
  30. self.create_button("=", 5, 3)
  31. def create_button(self, text, row, column):
  32. button = tk.Button(self.master, text=text, font=("Arial", 18), width=5,
  33. command=lambda: self.on_button_click(text))
  34. button.grid(row=row, column=column)
  35. def on_button_click(self, text):
  36. if text == "C":
  37. # 清空显示器
  38. self.result.set(0)
  39. return
  40. if text == "=":
  41. # 计算结果
  42. try:
  43. result = eval(self.result.get())
  44. self.result.set(result)
  45. except:
  46. messagebox.showerror("Error", "Invalid expression")
  47. return
  48. # 更新显示器
  49. if self.result.get() == "0":
  50. self.result.set(text)
  51. else:
  52. self.result.set(self.result.get() + text)
  53. if __name__ == "__main__":
  54. root = tk.Tk()
  55. calculator = Calculator(root)
  56. root.mainloop()

计算器运行结果

上面的代码中,我们定义了一个Calculator类,用于表示计算器应用程序。在该类的构造函数中,我们创建了若干个按钮,并为每个按钮指定了一个回调函数。

当用户点击按钮时,会调用回调函数on_button_click()。在该函数中,我们根据按钮的文本来执行相应的操作。例如,当用户点击数字按钮时,更新显示器的文本;当用户点击运算符按钮时,在显示器中添加运算符;当用户点击等号按钮时,计算表达式的结果并显示在显示器中。

运行上面的代码后,会弹出一个窗口,其中包含一个简单的计算器应用程序。用户可以通过点击按钮来进行简单的加减乘除运算。

一个简单的Tkinter贪吃蛇游戏应用程序

下面是一个简单的Tkinter贪吃蛇游戏应用程序,它能够让用户通过键盘控制贪吃蛇来吃掉食物:

  1. import tkinter as tk
  2. import random
  3. class Snake:
  4. def __init__(self, master):
  5. self.master = master
  6. self.master.title("Snake")
  7. # 创建画布
  8. self.canvas = tk.Canvas(self.master, width=400, height=400, bg="white")
  9. self.canvas.pack()
  10. # 初始化游戏数据
  11. self.snake = [(0, 0), (0, 1), (0, 2)]
  12. self.food = (5, 5)
  13. self.direction = "Right"
  14. self.score = 0
  15. # 绑定键盘事件
  16. self.master.bind("<Key>", self.on_key_press)
  17. # 开始游戏
  18. self.start_game()
  19. def start_game(self):
  20. # 绘制贪吃蛇和食物
  21. self.draw_snake()
  22. self.draw_food()
  23. # 更新游戏状态
  24. self.update_game()
  25. def draw_snake(self):
  26. # 清空画布
  27. self.canvas.delete("all")
  28. # 绘制贪吃蛇
  29. for x, y in self.snake:
  30. x1 = x * 20
  31. y1 = y * 20
  32. x2 = x1 + 20
  33. y2 = y1 + 20
  34. self.canvas.create_rectangle(x1, y1, x2, y2, fill="green")
  35. def draw_food(self):
  36. # 绘制食物
  37. x1 = self.food[0] * 20
  38. y1 = self.food[1] * 20
  39. x2 = x1 + 20
  40. y2 = y1 + 20
  41. self.canvas.create_oval(x1, y1, x2, y2, fill="red")
  42. def update_game(self):
  43. # 更新贪吃蛇位置
  44. head_x, head_y = self.snake[-1]
  45. if self.direction == "Left":
  46. new_head = (head_x - 1, head_y)
  47. elif self.direction == "Right":
  48. new_head = (head_x + 1, head_y)
  49. elif self.direction == "Up":
  50. new_head = (head_x, head_y - 1)
  51. else:
  52. new_head = (head_x, head_y + 1)
  53. self.snake.append(new_head)
  54. del self.snake[0]
  55. # 检查游戏是否结束
  56. if new_head[0] < 0 or new_head[0] >= 20 or new_head[1] < 0 or new_head[1] >= 20 or new_head in self.snake[:-1]:
  57. messagebox.showinfo("Game Over", f"Score: {self.score}")
  58. return
  59. # 检查贪吃蛇是否吃掉食物
  60. if new_head == self.food:
  61. while True:
  62. food_x = random.randint(0, 19)
  63. food_y = random.randint(0, 19)
  64. if (food_x, food_y) not in self.snake:
  65. break
  66. self.food = (food_x, food_y)
  67. tail_x, tail_y = self.snake[0]
  68. if self.direction == "Left":
  69. new_tail = (tail_x + 1, tail_y)
  70. elif self.direction == "Right":
  71. new_tail = (tail_x - 1, tail_y)
  72. elif self.direction == "Up":
  73. new_tail = (tail_x, tail_y + 1)
  74. else:
  75. new_tail = (tail_x, tail_y - 1)
  76. self.snake.insert(0, new_tail)
  77. self.score += 1
  78. # 绘制贪吃蛇和食物
  79. self.draw_snake()
  80. self.draw_food()
  81. # 定时更新游戏状态
  82. self.master.after(200, self.update_game)
  83. def on_key_press(self, event):
  84. if event.keysym in ["Left", "Right", "Up", "Down"]:
  85. self.direction = event.keysym
  86. if __name__ == "__main__":
  87. root = tk.Tk()
  88. snake = Snake(root)
  89. root.mainloop()

贪吃蛇游戏运行结果

上面的代码中,我们定义了一个Snake类,用于表示贪吃蛇游戏应用程序。在该类的构造函数中,我们创建了一个画布,并初始化了游戏数据。然后,我们绑定了键盘事件,并调用start_game()方法来开始游戏。

start_game()方法中,我们调用draw_snake()draw_food()方法来绘制贪吃蛇和食物。然后,调用update_game()方法来更新游戏状态。

update_game()方法中,我们首先更新贪吃蛇的位置。然后,检查游戏是否结束。如果游戏结束,则弹出一个消息框并返回。否则,检查贪吃蛇是否吃掉食物。如果吃掉食物,则更新食物的位置,并增加贪吃蛇的长度。最后,重新绘制贪吃蛇和食物,并定时调用update_game()方法来更新游戏状态。

当用户按下键盘时,会调用回调函数on_key_press()。在该函数中,我们根据按键来更新贪吃蛇的移动方向。

运行上面的代码后,会弹出一个窗口,其中包含一个简单的贪吃蛇游戏应用程序。用户可以通过键盘控制贪吃蛇来吃掉食物。

6. 结论

Tkinter库的优缺点

Tkinter库作为Python的标准GUI库,具有以下优点:

  • 它是Python的标准GUI库,无需安装第三方库即可使用。
  • 它提供了丰富的组件和布局管理器,能够满足大多数应用程序的需求。
  • 它具有良好的跨平台性,能够在Windows、macOS和Linux等操作系统上运行。

然而,Tkinter库也存在一些缺点:

  • 它的界面设计相对简陋,不如其他GUI库(如Qt和wxPython)美观。
  • 它的文档不够完善,有时需要查阅第三方资料才能解决问题。
  • 它的社区不够活跃,难以获得及时的技术支持。

7. 结语

以上就是本文关于Python Tkinter库入门指南的全部内容。希望本文能够帮助您快速掌握Tkinter库的基础知识,并能够运用所学知识来创建自己的图形用户界面应用程序。如果您对本文有任何疑问或建议,欢迎在评论区留言交流。

参考:Python Tkinter图形界面编程入门指南 - 知乎 (zhihu.com)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/517158
推荐阅读
相关标签
  

闽ICP备14008679号