求助,关于Python3.4的Tk组件做GUI的问题

Python029

求助,关于Python3.4的Tk组件做GUI的问题,第1张

# -*- coding: utf-8 -*-

# please input your code here.

from random import randint

import tkinter

from tkinter import *

from tkinter import messagebox

def main():

root = Tk()# 创建 GUI 主程序

calculator = Label()# 创建主窗口

calculator.pack(fill=BOTH, expand = 1)

addWidgets(calculator) # 调用函数,向窗口上添加功能按钮,以输入数字和运算符

root.title('Calculator')

root.wm_resizable(width = False, height = False) # 禁用窗口缩放

root.mainloop()

def addWidgets(frame):

n1=randint(1,13)

n2=randint(1,13)

n3=randint(1,13)

n4=randint(1,13)

expression = Text(frame, height = 2, width = 28) # 创建表达式输入窗口

number_1 = Button(frame, text=n1, width = 5,command = lambda: input_char(n1, expression))

number_2 = Button(frame, text=n2, width = 5,command = lambda: input_char(n2, expression))

number_3 = Button(frame, text=n3, width = 5,command = lambda: input_char(n3, expression))

number_4 = Button(frame, text=n4, width = 5,command = lambda: input_char(n4, expression))

# 创建数字按钮

btn_add = Button(frame, text = '+', width = 5,command = lambda: input_char('+', expression))

btn_subtract = Button(frame, text = '-', width = 5,command = lambda: input_char('-', expression))

btn_multiply = Button(frame, text = '*', width = 5,command = lambda: input_char('*', expression))

btn_divide = Button(frame, text = '/', width = 5,command = lambda: input_char('/', expression))

btn_equal = Button(frame, text = '=', width = 5,command = lambda: input_char(calcu(expression),expression))# 创建运算符输入按钮

btn_l = Button(frame, text = '(', width = 5,command = lambda: input_char('(', expression))

btn_r = Button(frame, text = ')', width = 5,command = lambda: input_char(')', expression))

btn_delete = Button(frame, text = 'clear', width = 5,command = lambda: expression.delete(0.0,END))

# 使用 grid_configure 函数将组件添加到主窗口上

expression.grid_configure(column = 1, row = 2, columnspan = 4, rowspan = 1)

number_1.grid_configure(column = 1, row = 4)

number_2.grid_configure(column = 2, row = 4)

number_3.grid_configure(column = 3, row = 4)

number_4.grid_configure(column = 4, row = 4)

btn_add.grid_configure(column = 1, row = 7)

btn_subtract.grid_configure(column = 2, row = 7)

btn_multiply.grid_configure(column = 3, row = 7)

btn_divide.grid_configure(column = 4, row = 7)

btn_equal.grid_configure(column = 3, row = 11)

btn_l.grid_configure(column = 1, row = 11)

btn_r.grid_configure(column = 2, row = 11)

btn_delete.grid_configure(column = 4, row = 11)

def input_char(char, expressionview):

expressionview.insert('1.end', char) # 输入按钮对应的字符

def calcu(expressionview):

#计算表达式的值,返回结果的字符串形式。如果表达式不合法,返回错误信息

equal_str = expressionview.get('1.0', '1.end')

expressionview.insert('1.end', '=')

s = []

i = 0

equal_list = []

while i <equal_str.__len__():

if equal_str[i] <= '9' and equal_str[i] >= '0':

tmp = 0

while i <equal_str.__len__() and equal_str[i] <= '9' and equal_str[i] >= '0':

tmp = tmp * 10 + (ord(equal_str[i]) - ord('0'))

i = i + 1

equal_list.append(tmp)

continue

else:

if equal_str[i] == '(':

s.append(equal_str[i])

elif equal_str[i] == ')':

try:

while s[s.__len__()-1] != '(':

equal_list.append(s.pop())

s.pop()

except IndexError:

return 'Invalid expersion!'

elif equal_str[i] == '+' or equal_str[i] == '-':

while s.__len__() >0 and s[s.__len__()-1] != '(':

equal_list.append(s.pop())

s.append(equal_str[i])

elif equal_str[i] == '*' or equal_str[i] == '/':

while s.__len__() >0 and (s[s.__len__()-1] == '*' or s[s.__len__() - 1] == '/'):

equal_list.append(s.pop())

s.append(equal_str[i])

i += 1

while s.__len__() >0:

equal_list.append(s.pop())

# print(equal_list) # print the postfix expression

cnt_num = 0

cnt_op = 0

for item in equal_list:

if type(item) == type(0): # integer.

cnt_num += 1

else:

cnt_op += 1

if cnt_op != cnt_num - 1:

return 'Invalid expersion!'

ans = []

for i in range(0, equal_list.__len__()):

if equal_list[i] == '+':

ans.append(ans.pop(ans.__len__()-2) + ans.pop(ans.__len__()-1))

elif equal_list[i] == '-':

ans.append(ans.pop(ans.__len__()-2) - ans.pop(ans.__len__()-1))

elif equal_list[i] == '*':

ans.append(ans.pop(ans.__len__()-2) * ans.pop(ans.__len__()-1))

elif equal_list[i] == '/':

try:

ans.append(ans.pop(ans.__len__()-2) / ans.pop(ans.__len__()-1))

except ZeroDivisionError:

return 'ZeroDivisionError: division by zero'

else:

ans.append(equal_list[i])

return str(ans[0])

if __name__ == '__main__':

main()

较为常用的GUI工具

Tkinter

可以在大多数的Unix平台下使用,

同样可以应用在Windows和Mac系统里。Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。

优点:是Python的内置库,无需额外下载,不存在兼容问题,且又非常详细的说明文档。

缺点:实现效果较为普通。

wxPython

是一个创建桌面GUI应用的跨平台工具包,它的主要开发者是Robin

Dunn。使用wxPython,开发者可以在Windows、Mac和多种Unix系统上开发应用程序。

优点:是一个免费的,可移植的GUI类库,用C++编写,可在Windows,Mac OS

X,GTK,X11等许多平台上使用。可用于多种语言,包括Python,Perl,Ruby等。

缺点:设计的界面美观程度和灵活性较为普通。

PyQT

是Qt框架的Python语言实现,也是最强大的GUI库之一。

PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件,因此PyQt的API接口与Qt的API接口很接近,但PyQt不再使用QMake系统和Q_OBJECT宏。

优点:功能非常强大,可以用PyQt5开很漂亮的界面另外它支持可视化界面设计,对新手非常友好,可以通过拖动一些模块就可以完成一些代码才能完成的工作,就跟C++的QT是一样的。

缺点:学习起来有一定难度。

PyGtk

优点:跟PyQt一样,可以实现很不错的效果,但是稍逊于PyQt,并且同样有UI设计工具Glade。

缺点:更适合GNOME平台。

Kivy

优点:是一个开源的Python框架,用于快速开发应用,实现各种当前流行的用户界面,比如多点触摸等等,可以运行于Windows,Linux, MacOS,

Android,

iOS等当前绝大部分主流桌面/移动端操作系统。Kivy基于Python,界面文件和程序文件相互分离的设计思路,设计简洁优雅,语法易学,适合新人入门。

缺点:只有一个中文文档还是特别全面,大多数教程还是英文版本。