Python Chapter 9: 使用Tkinter进行GUI程序设计 Part 2

6.几何管理器

Tkinter中的几何管理器分为:网格管理器、包管理器与位置管理器(最好不要对同一容器中的小构件使用多种管理器)

①网格管理器:将各个空间分布在看不见的网格中

 1 # Program 9.7
 2 from tkinter import *
 3
 4 class GridManagerDemo:
 5     window = Tk()
 6     window.title("Grid Manager Demo")
 7
 8     message = Message(window, text = "This Message widget occupies three rows and two columns")
 9     message.grid(row = 1, column = 1, rowspan = 3, columnspan = 2)
10     Label(window, text = "First Name:").grid(row = 1, column = 3)
11     Entry(window).grid(row = 1, column = 4, padx = 5, pady = 5)
12     Label(window, text = "Last Name:").grid(row = 2, column = 3)
13     Entry(window).grid(row = 2, column = 4)
14     Button(window, text = "Get Name").grid(row = 3, column = 4, padx = 5, pady = 5, sticky = E)
15
16     window.mainloop()
17
18 GridManagerDemo()

9) rowspan与columnspan将message放置在多行多列中

11、14) padx与pady填充单元格在水平与竖直位置上的可选空间,sticky = E使Button设置在单元格东边,E亦可以是W、S、N、NW、NE等组合

② 包管理器:将小构件一次一个放在另一个顶部或者一个挨着一个放置

 1 # Program 9.8
 2 from tkinter import *
 3
 4 class PackManagerDemo:
 5     def __init__(self):
 6         window = Tk()
 7         window.title("Pack Manager Demo 1")
 8
 9         Label(window, text = "Blue", bg = "blue").pack()
10         Label(window, text = "Red", bg = "red").pack(fill = BOTH, expand = 1)
11         Label(window, text = "Green", bg = "green").pack(fill = BOTH)
12
13         window.mainloop()
14
15 PackManagerDemo()

10)fill参数选择X,Y或BOTH,代表小控件填充水平、竖直或两个方向上的空间

  expand参数非零时,若父小构件比容纳所有打包小构件的所需空间都大,则将额外的空间分配给小构件

其运行结果如下(从上到下依次排布,有fill的会填充横纵向,有expand会被分配多余的空间):

 1 # Program 9.9
 2 from tkinter import *
 3
 4 class PackManagerDemoWithSide:
 5     window = Tk()
 6     window.title("Pack Manager Demo 2")
 7
 8     Label(window, text = "Blue", bg = "blue").pack(side = LEFT)
 9     Label(window, text = "Red", bg = "red").pack(side = LEFT, fill = BOTH, expand = 1)
10     Label(window, text = "Green", bg = "green").pack(side = LEFT, fill = BOTH)
11
12     window.mainloop()
13
14 PackManagerDemoWithSide()

8-10) side = LEFT意味着靠左放,该选项可以是LEFT/RIGHT/TOP/BOTTOM

其运行结果如下(从左到右依次排布,有fill的会填充横纵向,有expand会被分配多余的空间):

③ 位置管理器:将小构件放在绝对位置上

 1 # Program 9.10
 2 from tkinter import *
 3
 4 class PlaceManagerDemo:
 5     def __init__(self):
 6         window = Tk()
 7         window.title("Place Manager Demo")
 8
 9         Label(window, text = "Blue", bg = "blue").place(x = 20, y = 20)
10         Label(window, text = "Red", bg = "red").place(x = 50, y = 50)
11         Label(window, text = "Green", bg = "green").place(x = 80, y = 80)
12
13         window.mainloop()
14
15 PlaceManagerDemo()

9-11) 小控件.place(x, y)用位置管理器将小控件放在一定的绝对位置上

其运行结果如下:

注意:位置管理器不能兼容所有计算机,受分辨率的影响而影响,应尽量避免使用位置管理器

7. 实例研究:贷款计算器

开发一个GUI程序的主要步骤:

1)绘制轮廓图来设计用户界面

2)处理按钮等引发的事件

 1 # Program 9.11
 2 from tkinter import *
 3
 4 class LoanCalculator:
 5     def __init__(self):
 6         window = Tk()
 7         window.title("Loan Calculator")
 8
 9         Label(window, text = "Annual Interest Rate").grid(row = 1, column = 1, sticky = W)
10         Label(window, text = "Number of Years").grid(row = 2, column = 1, sticky = W)
11         Label(window, text = "Loan Amount").grid(row = 3, column = 1, sticky = W)
12         Label(window, text = "Monthly Payment").grid(row = 4, column = 1, sticky = W)
13         Label(window, text = "Total Payment").grid(row = 5, column = 1, sticky = W)
14
15         self.annualInterestRateVar = StringVar()
16         Entry(window, textvariable = self.annualInterestRateVar, justify = RIGHT).grid(row = 1, column = 2)
17         self.numberOfYearsVar = StringVar()
18         Entry(window, textvariable = self.numberOfYearsVar, justify = RIGHT).grid(row = 2, column = 2)
19         self.loanAmountVar = StringVar()
20         Entry(window, textvariable = self.loanAmountVar, justify = RIGHT).grid(row = 3, column = 2)
21
22         self.monthlyPaymentVar = StringVar()
23         lblMonthlyPayment = Label(window, textvariable = self.monthlyPaymentVar).grid(row = 4, column = 2, sticky = E)
24         self.totalPaymentVar = StringVar()
25         lblTotalPayment = Label(window, textvariable = self.totalPaymentVar).grid(row = 5, column = 2, sticky = E)
26
27         btComputePayment = Button(window, text = "Compute payment", command = self.computePayment).grid(row = 6, column = 2, sticky = E)
28
29         window.mainloop()
30
31     def computePayment(self):
32         monthlyPayment = self.getMonthlyPayment(float(self.loanAmountVar.get()), float(self.annualInterestRateVar.get()) / 1200, int(self.numberOfYearsVar.get()))
33         self.monthlyPaymentVar.set(format(monthlyPayment, "10.2f"))
34         totalPayment = float(self.monthlyPaymentVar.get()) * 12 * int(self.numberOfYearsVar.get())
35         self.totalPaymentVar.set(format(totalPayment, "10.2f"))
36
37     def getMonthlyPayment(self, loanAmount, monthlyInterestRate, numberOfYears):
38         monthlyPayment = loanAmount * monthlyInterestRate / (1 - 1 / (1 + monthlyInterestRate) ** (numberOfYears * 12))
39         return monthlyPayment
40
41 LoanCalculator()

33、35) 可通过monthlyPaymentVar.set(...)的方式,更改与小构件绑定的变量值从而更改小构件的参数(如显示内容等)

16、23) Entry()与Label()皆使用textvariable的参数,不过Entry()中其指代用户输入的内容,Label()中指代标签显示的内容

many) 很多行当中都用到了Label(...).grid(...)的连写方式,即小构件无需另外变量储存,除非需要更改小构件参数(当然与其绑定的参数更改可以如上上行进行,但背景颜色、字体等参数仍然需要通过调用原小控件变量的方式进行更改,这种情况下就需要thing = Label(...).grid(...)的方式)

程序的运行结果如下:

8. 显示图像

# 鉴于书上程序实例中的图片文件没有获取,这里仅概述创建图像对象与显示的语法

创建:

myimage = PhotoImage(file = "yourpath.gif")

此时创建了一个图片路径为"yourpath.gif"的图片对象myimage。

与Button、Checkbutton、Radiobutton的互动:

Button(frame, image = myimage)
Checkbutton(frame, image = myimage)
Radiobutton(frame, image = myimage)

此举将创建包含myimage对象中的图像的各种按钮

与Canvas的互动:

canvas = Canvas(frame1)
canvas.create_image(width, height, image = myimage)

此举将创建一个背景内容为myimage对象所含图片的画布,事实上一张画布可以显示多个图像

原文地址:https://www.cnblogs.com/fsbblogs/p/9693854.html

时间: 2024-12-10 03:42:12

Python Chapter 9: 使用Tkinter进行GUI程序设计 Part 2的相关文章

Python Chapter 10: 列表 Part3

10.10 查找列表 )线性查找 线性查找顺序地将关键字key与列表中的每一个元素进行比较,直到找到某个匹配元素时返回其下标,亦或在找不到时返回-1.代码如下: # The function for finding a key in a list def linearSearch(lst, key): for i in range(len(lst)): if lst[i] == key: return i return -1 若关键字存在,线性查找在找到关键字前平均需要查找一半的元素,其运行时间

python服务器文件上传下载+GUI【tkinter】

大概就是一个通过应用程序来和服务器打交道的这么一个,小东西 1.GUI 用的是tkinter 1 # -*- coding: UTF-8 -*- 2 from tkinter import * 3 import tkinter.filedialog 4 import requests 5 6 7 def Upload(): 8 print('upload') 9 selectFileName = tkinter.filedialog.askopenfilename(title='选择文件')#选

Python 之 使用Tkinter 做GUI 研究机器人走迷宫

这本是课程的一个作业研究搜索算法,当时研究了一下Tkinter,然后写了个很简单的机器人走迷宫的界面,并且使用了各种搜索算法来进行搜索,如下图: 使用A*寻找最优路径: 由于时间关系,不分析了,我自己贴代码吧.希望对一些也要用Tkinter的人有帮助. from Tkinter import * from random import * import time import numpy as np import util class Directions: NORTH = 'North' SOU

python 爬取糗事百科 gui小程序

前言:有时候无聊看一些搞笑的段子,糗事百科还是个不错的网站,所以就想用Python来玩一下.也比较简单,就写出来分享一下.嘿嘿 环境:Python 2.7 + win7 现在开始,打开糗事百科网站,先来分析.地址:https://www.qiushibaike.com 一般像这种都是文本的话,查看源代码就可以看到内容了. 已经可以看到都是在一个class 为content 的div里面,这样就很简单了,直接上正则表达式来匹配就好了. <div.*?class="content"&

opencv实现人脸识别(五) 运用tkinter进行GUI绘制 整合人脸识别模块

因为之前学习过tkinter库,所以在学习了人脸识别模块的编写后, 打算绘制一个简单的GUI来应用人脸识别功能. 主界面如下所示: 签到打开在点开后直接进行人脸识别,如果成功则自动关闭视频窗口. 录入新的人脸界面: 输入姓名后打开摄像头,开始拍摄镜头前的人的照片,然后生成训练文件. 并且可以查询历史签到记录. 这里需要另外添加的模块是关于数据库的,这里选用了sqlite,所需的功能也很简单, 只需要两个表,一个用来存放用户姓名,一个用来存放签到记录. 这里是数据库模块的代码 db.py: imp

小贞贞python关于requests和tkinter模块项目实战

requests模块主要是用于网页的请求,获取相应数据 tkinter模块是python基于GUI的一个模块,大致模块如下: 具体可参照:https://www.cnblogs.com/shwee/p/9427975.html 今天给大家介绍,自制翻译小工具的具体项目实战: 整体是实现方式: 步骤一:通过requets模块请求百度翻译 步骤二:通过tkinter模块制作界面,将界面输入的内容传入requests模块,然后点击“翻译”按钮,显示requests模块返回的数据 步骤三:制作成一个ex

Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)

一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点:扩展性差 面向对象的程序设计:核心是对象,对象是特征(变量)与技能(函数)的结合体,是一种上帝式的思维方式 优点:解决了程序的扩展性 缺点:可控性差 二.类和对象 以游戏举例,基于面向对象设计一个款游戏:英雄联盟,每个玩家选一个英雄,每个英雄都有自己的特征和和技能,特征即数据属性,技能即方法属性,特

Python在线聊天软件(Tkinter)

1.python2.7下安装 apt-get install python-tk 主要功能是实现客户端与服务器端的双向通信,这个小东西用到的主要知识点: 1.Python Socket:2.Python Tkinter库. 当然也应该了解如下的基础知识:1.Python基本语法:2.Python基本语句:3.Python函数:4.Python模块:5.Python异常处理:6.Python面向对象: 7.Python线程等相关知识. 另外:我使用的是Python2.5这个版本,如果你使用的Pyt

Natural Language Processing with Python - Chapter 0

一年之前,我做梦也想不到会来这里写技术总结.误打误撞来到了上海西南某高校,成为了文科专业的工科男,现在每天除了膜ha,就是恶补CS.导师是做计算语言学的,所以当务之急就是先自学计算机自然语言处理,打好底子准备做科研(认真脸). 进入正题,从图书馆找了本“Natural Language Processing with Python” (影印版),书长这个样子,作者是Steven Bird, Ewan Klein和Edward Loper.粘贴个豆瓣链接供参考:https://book.douba