问题
tkinter(Tk interface)是 Python 的标准 GUI 库,支持跨平台的 GUI 程序开发。tkinter 适合小型的 GUI 程序编写,也特别适合初学者学习 GUI 编程。
那么作为 GUI 编程的一个小白,该如何使用 tkinter 模块设计出一个如下图所示效果的简单的计算器呢?
分析
首先得把使用 tkinter 的一个面向对象的框架实现出来,再往里添加组件即可:
from tkinter import *
class Application(Frame):
"""一个经典的GUI程序写法"""
def __init__(self, master=None):
super(Application, self).__init__(master)
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
"""创建组件"""
if __name__ == '__main__':
root = Tk() # 创建一个主窗口
root.title('我的计算器')
root.geometry('230x315+0+0') # 调整窗口位置和大小
app = Application(master=root)
root.mainloop() # 调用组件的 mainloop() 方法,进入事件循环
有了一个整体的框架后,我们往里再添加任何组件就易如反掌了。这里仅仅需要将实现计算器的逻辑代码写在 createWidget() 方法中就行了,在 Application 类中可定义一些响应事件方法,完成一个计算器的完整逻辑,这里就只设计一个简单的计算器 UI 界面,计算器的完整实现功能逻辑日后再补加上去。
解决
下面就直接附上完整代码,有基础的应该一看就能懂了…
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from tkinter import *
class Application(Frame):
"""一个经典的GUI程序写法"""
def __init__(self, master=None):
super(Application, self).__init__(master)
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
"""创建组件"""
# 计算器上的各个数字键和功能键全部集合到一个列表中
self.btn_key = [
['MC', 'M+', 'M-', 'MR'],
['C', '±', '÷', '×'],
['7', '8', '9', '-'],
['4', '5', '6', '+'],
['1', '2', '3', '='],
['0', '.']
]
v1 = StringVar()
v1.set('0') # 设置输入框中初始显示值为 0
Entry(self, textvariable=v1, font=('微软雅黑', 14)).grid(row=0, column=0, columnspan=4, sticky=EW, pady=10)
for i, li in enumerate(self.btn_key):
for index, k in enumerate(li):
if k == '=':
Button(self, text=k, fg='black', font=('微软雅黑', 14)) \
.grid(row=i + 1, column=index, sticky=NSEW, rowspan=2)
elif k == '0':
Button(self, text=k, fg='black', font=('微软雅黑', 14)) \
.grid(row=i + 1, column=index, sticky=EW, columnspan=2)
elif k == '.':
Button(self, text=k, fg='black', font=('微软雅黑', 14)) \
.grid(row=i + 1, column=index + 1, sticky=EW)
else:
Button(self, text=k, fg='black', font=('微软雅黑', 14)) \
.grid(row=i + 1, column=index, sticky=EW)
if __name__ == '__main__':
root = Tk() # 创建一个主窗口
root.title('我的计算器')
root.geometry('230x315+0+0') # 调整窗口位置和大小
app = Application(master=root)
root.mainloop() # 调用组件的 mainloop() 方法,进入事件循环