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如何保存需要大小的图片? ...
随机推荐
- Nginx版本。
Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version:最新稳定版,生产环境上建议使用的版 ...
- redis为什么是单核单线程
1)以前一直有个误区,以为:高性能服务器 一定是多线程来实现的 原因很简单因为误区二导致的:多线程 一定比 单线程 效率高,其实不然! 在说这个事前希望大家都能对 CPU . 内存 . 硬盘的速度都有 ...
- GoAccess - 可视化 Web 日志分析工具
Centos安装: yum -y install goaccess 使用goaccess命令生成HTML文件 LANG="en_US.UTF-8" bash -c 'goacces ...
- EVE如何提升名望值
目录 背景介绍 简介 名望值划分 军团名望值 利弊 背景介绍 玩eve将近3个星期,开着毒蜥级刷1级代理人任务感觉没有一点难度,想尽快刷3.4级代理任务,而我目前能够接到的最高代理任务也就才1级. ...
- uni-app微信小程序解决多个视频同时播放问题
这里我用的uni-app开发的小程序,微信小程序原生开发也是同理, 写法和api简单改下就行 当你的页面上有多个视频video组件标签时, 会出现多个视频可以同时播放的问题,这样显然是不正常的, 那么 ...
- 2020.11.24 javaScript匿名函数的使用
参考链接:http://www.voidcn.com/article/p-ngxxuegm-bmv.html 匿名函数: 函数表达式中创建的函数叫做匿名函数,也就是没有函数名的函数. 自执行函数: 创 ...
- Vue父子组件传值.sync
<template> <div class="content"> <btn :btnName.sync='num' ></btn> ...
- 自定义DOM事件函数封装
非原生DOM触发,个性化定制的自定义事件. currentTarget(DOM对象):要触发事件的元素节点. type(字符串):触发的事件类型,例如"keydown". bubb ...
- MAC下使用Wireshark调试chrome浏览器的HTTP/2流量
1.设置环境变量 mkdir ~/tls && touch ~/tls/sslkeylog.log #zsh echo "\nexport SSLKEYLOGFILE=~/t ...
- Centos7.6操作系统安装
新建虚拟机 默认下一步 稍后安装操作系统 选择对应的操作系统和版本 指定虚拟机名称和存储位置 处理器配置 内存配置:图形化界面至少2G,字符界面至少1G. 网络类型默认为NAT I/O控制器类型默认L ...