Python tkinter的简单使用,在绘布上播放GIF和图片
Python tkinter的简单使用,在绘布上播放GIF和图片
文章目录
前言
本文章代码是具有具有python基础上写着来学习的,本文的代码可能只涉及到下面目录所提及的部分内容,若有需要的话,可以查看,并且指出一起学习进步。
提示:本文章是在学习过程中留下的一些笔记。本文章的一些核心代码是在网上参考别人的,我是做了一下改动。
以下是本篇文章正文内容
一、tkinter 的简单组件以及pack(),grid方法、place方法。
按钮的使用Button, Label的使用。
导入语句
from tkinter import *
声明Button和Label
btn1 = Button(self.root, text="R", width=15, font='宋体 12 bold', relief='raised', bg='white', fg='blue',
command=choose_R.show_R)
btn1.place(x=200, y=20)
label2 = Label(root1,text = str,wraplength= 180)
label2.pack()
在tkinter的绘布上放映图片和GIF的核心代码。
这个放映是在弹出新窗口上播放的GIF。主要是win = Toplevel();
要是在原界面上播放也差不多。本文章就不展示源代码文件
代码
def show_R(self):
win = Toplevel()
canvas = Canvas(win, width=1380, height=800, bg='White')
canvas.pack(expand=True)
# 最大帧数
numIdx = 28
frames = [PhotoImage(file='D:/Python_code/tk/final/gif/R_fianl.gif',
format='gif -index %i' % (i)) for i in range(numIdx)]
# 填充帧内容到frames
def update(idx): # 定时器函数
frame = frames[idx]
idx += 1 # 下一帧的序号:
canvas.create_image(15, 15, anchor=NW, image=frame)
# label.configure(image = frame) # 显示label方法当前帧的图片
# 0.1秒(500毫秒)之后继续执行定时器函数(update)
if self.isplaying:
self.root.after(self.time, update, idx % numIdx)
else:
self.stop_idx = idx
win.after(0, update(0))
二、核心代码
1.主窗体
from tkinter import *
from tkinter import messagebox
from show_R import R
from tkinter.ttk import Separator
from show_lw import lw
from show_sw import sw
from show_beq import beq
from show_j import Jump
class test_menu:
def __init__(self, root, time):
self.title = ' 大勇'
self.root = root
self.time = time
self.isplaying = False
self.stop_idx = 0
self.show_about
self.minimum
self.show_test
self.text_exit
def get_time(self):
return self.time
def minimum(self):
self.root.iconify()
# 让窗口最小化
def text_exit(self):
# 弹出式窗口页面
ret = messagebox.askquestion("EXIT", '确定要离开吗?')
if ret == 'yes':
self.root.destroy()
def show_about(self):
# 菜单内的那个关于
root1 = Toplevel()
root1.title("关于")
screen_width = self.root.winfo_screenwidth()
screen_height = self.root.winfo_screenheight()
x= 300
y =240
w = (screen_width - x) / 2
h = (screen_height -y) /2
root1.geometry('%dx%d+%d+%d'%(x, y, w, h))
label1 = Label(root1, text='关于模拟数据通路', fg='black', bg='white')
label1.pack()
sep = Separator(root1,orient = HORIZONTAL)
sep.pack(fill = X,pady = 5)
str ="此程序只能做到初步模拟数据通路的流动在指令模拟方面只是绘制了部分指令,R型的指令并没有细分,只是画了很初步的流法,流动的效果也不是很好,一些指令线路的流动也没有画出来,流动的指令只是主要部分的流动,实际情况会比此程序演示的流动还要复杂许多本程序只是参照课本"
label2 = Label(root1,text = str,wraplength= 180)
label2.pack()
label3 = Label(root1, text='制作时间:2021年6月1日',fg='black', bg='white')
label3.pack()
root1.mainloop()
def show_test(self):
def rate( current_time):
ret =messagebox.askokcancel('更改速度','确定更改速度或者取消?')
if ret == True:
self.time -= current_time
choose_R.update_time(self.time)
choose_lw.update_time(self.time)
choose_sw.update_time(self.time)
choose_beq.update_time(self.time)
def show_popupmenu(event):
popmenu.post(event.x_root, event.y_root)
# 获取窗口的大小
screen_width = self.root.winfo_screenwidth()
screen_height = self.root.winfo_screenheight()
self.root.title("模拟数据通路")
# root.iconbitmap('mystar.ico')
# 下面为设置窗口的大小,x为宽,y为高,w,h为离左边的位置
x = 720
y = 480
w = (screen_width - x) / 2
h = (screen_height -y) /2
self.root.geometry('%dx%d+%d+%d'%(x, y, w, h))
# 声明各个类的对象
time = self.get_time()
choose_R= R(self.isplaying,self.root,time)
choose_lw= lw(self.isplaying,self.root,time)
choose_sw = sw(self.isplaying,self.root,time)
choose_beq = beq(self.isplaying,self.root,time)
choose_j = Jump(self.isplaying,self.root,time)
btn1 = Button(self.root, text="R", width=15, font='宋体 12 bold', relief='raised', bg='white', fg='blue',
command=choose_R.show_R)
btn2 = Button(self.root, text="lw", width=15, font='宋体 12 bold', relief='raised', bg='white', fg='blue',
command=choose_lw.show_lw)
btn3 = Button(self.root, text="sw", width=15, font='宋体 12 bold', relief='raised', bg='white', fg='blue',
command=choose_sw.show_sw)
btn4 = Button(self.root, text='beq', width=15, font='宋体 12 bold', relief='raised', bg='white', fg='blue',
command=choose_beq.show_beq)
btn5 = Button(self.root,text ='jump',width = 15,font = '宋体 12 bold',relief ='raised',bg= 'white',fg = 'blue',
command = choose_j.show_jump)
menubar = Menu(self.root)
# 建立菜单类对象,并将此菜单类别命名为File
filemenu = Menu(menubar)
menubar.add_cascade(label='菜单', font='宋体 36 bold', menu =filemenu)
# 在FIle菜单中建立子菜单列表
findmenu = Menu(filemenu,tearoff=False)
findmenu.add_command(label = '1.0x',command = lambda: rate(0))
findmenu.add_command(label = '1.25x',command = lambda:rate(100))
findmenu.add_command(label = '1.5x',command = lambda:rate(100))
findmenu.add_command(label = '2.0x',command = lambda:rate(200))
findmenu.add_command(label = '0.75x',command = lambda:rate(-200))
findmenu.add_command(label = '0.5x',command = lambda:rate(-400))
filemenu.add_cascade(label='速度 ', menu = findmenu,command=rate)
filemenu.add_command(label='关于', command=self.show_about)
filemenu.add_command(label='退出', command=self.text_exit)
# 显示菜单对象
self.root.config(menu=menubar)
popmenu = Menu(self.root, tearoff=False)
findmenu1 = Menu(popmenu,tearoff=False)
# 建立弹出式菜单对象
findmenu1.add_command(label = '1.0x',command = lambda: rate(0))
findmenu1.add_command(label = '1.25x',command = lambda:rate(100))
findmenu1.add_command(label = '1.5x',command = lambda:rate(100))
findmenu1.add_command(label = '2.0x',command = lambda:rate(200))
findmenu1.add_command(label = '0.75x',command = lambda:rate(-200))
findmenu1.add_command(label = '0.5x',command = lambda:rate(-400))
popmenu.add_cascade(label = '速度',menu = findmenu1)
popmenu.add_command(label='最小化',command=self.minimum)
popmenu.add_command(label='退出',command=self.text_exit)
self.root.bind('<Button-3>', show_popupmenu)
btn1.place(x=200, y=20)
btn2.place(x=200, y=80)
btn3.place(x=200, y=140)
btn4.place(x=200, y=200)
btn5.place(x= 200,y=260)
# 程序图标
self.root.iconbitmap('D:/Python_code/tk/final/gif/1.ico')
self.root.mainloop()
其他代码文件我只放一个做示例。
from tkinter import *
import time
class R:
def __init__(self, isplaying,root,time):
self.isplaying = isplaying
self.root = root
self.time = time
def update_time(self,current_time):
if current_time != self.time:
self.time = current_time
def show_R(self):
"""下面为在画布上展示R型指令的设计"""
win = Toplevel()
canvas = Canvas(win, width=1380, height=800, bg='White')
canvas.pack(expand=True)
# 最大帧数
numIdx = 28
frames = [PhotoImage(file='D:/Python_code/tk/final/gif/R_fianl.gif',
format='gif -index %i' % (i)) for i in range(numIdx)]
# 填充帧内容到frames
def slow_speed():
# 减速
if(self.time <= 1500):
self.time += 100
def add_speed():
# 加速
if(self.time>100):
self.time -=100
def test_stop():
"""下面为播放与暂停的界面"""
btn2.place(x=300, y=740)
btn3.place(x=500, y=740)
if self.isplaying == True:
self.isplaying = False
counter = '播放'
btn4.config(text=str(counter))
else:
self.isplaying = True
btn4.config(text=str("暂停"))
update(self.stop_idx)
def exit_win():
self.time = 500
self.isplaying = False
win.destroy()
def update(idx): # 定时器函数
frame = frames[idx]
idx += 1 # 下一帧的序号:
canvas.create_image(15, 15, anchor=NW, image=frame)
# label.configure(image = frame) # 显示label方法当前帧的图片
# 0.1秒(500毫秒)之后继续执行定时器函数(update)
if self.isplaying:
self.root.after(self.time, update, idx % numIdx)
else:
self.stop_idx = idx
btn1 = Button(win, text="结束", width=10, height=2, bg='White', fg='black',
font='宋体 12 bold', relief='raised', command=exit_win)
btn2 = Button(win, text="加速", width=10, height=2, bg='White', fg='black',
font='宋体 12 bold', relief='raised', command=add_speed)
btn3 = Button(win, text="减速", width=10, height=2, bg='White', fg='black',
font='宋体 12 bold', relief='raised', command=slow_speed)
btn4 = Button(win, text="播放", width=10, height=2, bg='White', fg='black',
font='宋体 12 bold', relief='raised', command=test_stop)
# btn5 = Button(win, text="绘图", width=10, height=2, bg='White', fg='black',
# font='宋体 12 bold', relief='raised', command= paint_photo)
btn1.place(x=100, y=740)
btn4.place(x=700, y=740)
win.after(0, update(0))
# 结束后重新调用
主函数
# 这是硬件实践的主界面测试·
from time import time
from tkinter import *
from main_test import test_menu
# 主函数
if __name__=="__main__":
root = Tk()
my_menu = test_menu(root,500)
my_menu.show_test()
总结
提示:本文章只是为了解决不能把图片放映到源文件上。如果需要全部源文件,可以在文章下面留言我,我在把代码文件发出来,希望对大家有所帮助。
Python tkinter的简单使用,在绘布上播放GIF和图片的更多相关文章
- Python tkinter 实现简单登陆注册 基于B/S三层体系结构,实现用户身份验证
Python tkinter 实现简单登陆注册 最终效果 开始界面 注册 登陆 源码 login.py # encoding=utf-8 from tkinter import * from ...
- [小菜随笔]python tkinter实现简单的ping命令
本文主要是介绍python图形界面上的按键与实际功能的对接,其实编程掌握了基础之后的学习应该都是靠自己去挖掘其他的 在网上发现多半教程都是2的,故本文使用的是python3.5,其实也没什么区别,就有 ...
- [原创]Python入门到简单网站目录扫描器编写(上)
1.字符串,整型,浮点型.区别以及用法 |------字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 可以不严格的说,你可以认为引号包括的,都属于字符串 ...
- python科学计算库numpy和绘图库PIL的结合,素描图片(原创)
# 导入绘图库 from PIL import Image #导入科学计算库 import numpy as np #封装一个图像处理工具类 class TestNumpy(object): def ...
- Webform之FileUpload(上传按钮控件)简单介绍及下载、上传文件时图片预览
1.FileUpload上传控件:(原文:http://www.cnblogs.com/hide0511/archive/2006/09/24/513201.html) FileUpload 控件显示 ...
- 用python写个简单的小程序,编译成exe跑在win10上
每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...
- Python Tkinter 学习成果:点歌软件music
笔者工作业余时间也没什么爱好,社交圈子也小,主要娱乐就是背着自己带电瓶的卖唱音响到住地附近找个人多的位置唱唱KtV. 硬件上点歌就用笔记本电脑,歌曲都是网上下载的mkv格式的含有两个音轨的视频.因此点 ...
- python——Tkinter图形化界面及threading多线程
Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macinto ...
- Python Tkinter 窗口创建与布局
做界面,首先需要创建一个窗口,Python Tkinter创建窗口很简单:(注意,Tkinter的包名因Python的版本不同存在差异,有两种:Tkinter和tkinter,读者若发现程序不能运行, ...
- 基于Python PIL实现简单图片格式转化器
基于Python PIL实现简单图片格式转化器 目录 基于Python PIL实现简单图片格式转化器 1.简介 2.前期资料准备 2.1.1如何实现图片格式转换? 2.1.2如何保存需要大小的图片? ...
随机推荐
- pycharm conmunity 2022.1没有mange repositories,只能使用命令方式修改镜像源(长期可信)
https://blog.csdn.net/qq_43625764/article/details/124656990
- Shiro权限管理框架-@RequiresPermissions 注解 使用问题记录
背景: 需要在springboot项目里面用到shiro的权限管理,Shiro访问控制流程:先shiro认证(登录时调用) 然后 shiro授权,但是项目里面登录的功能用的公司统一的系统,所以需要&q ...
- unlua
安装 复制 Plugins 目录到你的UE工程根目录. 重新启动你的UE工程 注意点 新建工程后,必须重新拷贝插件,重新编译.不能从老项目中拷贝,会崩溃~ 加载c++类和蓝图类 -- c++类 loc ...
- LoadRunner——创建场景及运行场景(三)
1. 创建场景 场景:用户并发访问的策略,包含用户数.加载用户的时间等 启动第二个组件 : 控制台 (controller) 方式1: 开始->所有程序->HPLoadRunner-> ...
- 思必驰周强:AI 和传统信号技术在实时音频通话中的应用
如何用 AI 解决声音传输&处理中的三大问题?三大问题又是哪三大问题? 在「RTE2022 实时互联网大会」中,思必驰研发总监 @周强以<AI 和传统信号技术在实时音频通话中的应用> ...
- Z 函数
简单记一下,避免忘记. z 函数 对于字符串 \(S\),我们将 \(z(i)\) 定义为从 \(i\) 开始的后缀与 \(S\) 的最长公共前缀的长度. \(O(n)\) 求出 z 函数 我们添加一 ...
- 基于深度学习的智能PCB板缺陷检测系统(Python+清新界面+数据集)
摘要:智能PCB板缺陷检测系统用于智能检测工业印刷电路板(PCB)常见缺陷,自动化标注.记录和保存缺陷位置和类型,以辅助电路板的质检.本文详细介绍智能PCB板缺陷检测系统,在介绍算法原理的同时,给出P ...
- crontab使用说明【一文搞懂Linux定时任务Crontab】
1.简介 cron是一个在后台运行调度的守护进程,而crontab是一个设置cron的工具.cron调度的是/etc/crontab文件. 2.centos安装crontab yum install ...
- Python多线程与GIL锁
Python多线程与GIL锁 python多线程 Python的多线程编程可以在单个进程内创建多个线程来同时执行多个任务,从而提高程序的效率和性能.Python的多线程实现依赖于操作系统的线程调度器, ...
- C++ 标准库 sort() / stable_sort() / partial_sort() 对比
C++ STL标准库中提供了多个用于排序的Sort函数,常用的包括有sort() / stable_sort() / partial_sort(),具体的函数用法如下表所示: 函数 用法 std::s ...