(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

大家好,又见面了,我是全栈君。

(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

 

今天,我们又来搞事情了。

(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

一、系列章节列表

1、过分了,别人用来做桌面应用开发,这家伙却用来撩妹(2)-上帝给你开了各种撩妹窗口(Tkinter)

2、过分了,别人用来做桌面应用开发,这家伙却用来撩妹(1)–上帝给你开一个窗口(Tkinter)

二、目录

(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

一、系列章节列表

二、目录

三、前言

四、正文

第一步:我有一个窗口

第二步:弹窗之同桌叫我不要越过38线

第三步:弹窗之越过38线的我

第四步:弹窗之哪些隐藏的甜言蜜语

第五步:弹窗之哪些隐藏的你的图片

五、总结


三、前言

在开始学习研究这篇文章之前,你可能需要先看一下前面两篇文章,因为我们所用到的函数方法都是在前面基础上的延伸,对你理解这篇文章也是有不错的帮助。此文,我们主要探寻如何在当我们达到某一条线,或者某一个点的时候,显示我们需要的内容。

四、正文

三八线:

含义一1945年9月2日,根据盟国协议,盟军最高司令官麦克阿瑟在第一号指令中,以北纬38度线为界作为美苏两国军队分别受理驻朝日军的投降事宜和对日开展军事活动的临时分界线,以北为驻朝苏军受降区,以南为美军受降区

含义二一般分界线,同学之间同桌的课桌中间的“分界线”。 

(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

是不是有小时的回忆。哈哈。今天,我们来聊一聊,越过三八线的改变。

第一步:我有一个窗口

首先,我们先来实现一个窗口。

(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

import tkinter
from tkinter import *
tk=tkinter.Tk()
 
def window():
    tk.title("一个窗口")  # 设置窗口名称
    tk.geometry("300x300+500+300")
    tk.iconbitmap('favicon.ico')
    tk["background"] = "#7AC5CD"
    # tk.attributes("-toolwindow", True)#隐藏顶部工具栏之后,icon不会显示
    tk.mainloop()
 
if __name__ == '__main__':
    window()

第二步:弹窗之同桌叫我不要越过38线

弹窗已经实现了,现在,我们来以桌面中心线为中心,同桌叫我不要超过中心线。不能超过中线。如图

(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

这个方法是使用设置窗口的方式,并更新窗口位置,不过有应该缺点,当边框超过中线之后,界面就会因为窗口改变事件,不断循环而卡死,大家有什么好的方法,欢迎在评论区讨论。

 代码如下:

import tkinter

tk = tkinter.Tk()
tk.title("一个窗口")  # 设置窗口名称
tk.geometry("300x300+200+300")
tk.iconbitmap('favicon.ico')
tk.attributes("-toolwindow", True)
w = tk.winfo_screenwidth()#获取屏幕宽
h = tk.winfo_screenheight()#获取屏幕高

def update_test(e):
    tk.update()
    # 获取屏幕的大小;
    height = tk.winfo_height()
    width = tk.winfo_width()
    # 获取窗体的位置
    x = tk.winfo_x()
    y = tk.winfo_y()
    if x + width > w / 2>x:
        tk.geometry("%sx%s+%s+%s" % (int(w / 2 - x), height, x, y))

tk.bind("<Configure>", update_test)
tk.mainloop()

第三步:弹窗之越过38线的我

弹窗已经实现了,现在,我们来以桌面中心线为中心,当弹窗在左边时显示一个颜色,当弹窗在右边时,显示一个颜色。

这里有两个变化,突变和渐变

突变:突然改变,达到超过某一条线之后,突然变为另外一个。

渐变:逐渐改变,到达某一条线时,中间会显示这条分界线,逐渐变为另外一个。

思考:刚开始编写时,我尝试了使用弹窗的标签label,但是似乎不如人意,但也是勉强实现了突变。

当窗口的所在的坐标超过屏幕的二分之一时,变为蓝色。

也就是我们需要知道屏幕的2分之一的位置,以及窗口坐标的位置,集合到之前我们学习到的知识,因此就可以得到。

渐变思考:在上面这种方式,似乎还是没有满足我们想要的结果,要是能慢慢过渡为另外一个颜色,那就好了。

这次不能像之前那样,使用label了,我们这里需要用到另外一个新的知识。Tkinter的画布功能,canvas。

w = tk.winfo_screenwidth()#获取屏幕宽
h = tk.winfo_screenheight()#获取屏幕高
cn=Canvas(tk, height=h, width=w,bg="white")#设置画布高宽,背景颜色

(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

 

函数  .create_rectangle(0, 0, w / 2 - x, height, fill='red', outline='white')
#创建一个矩形,create_rectangle(x,y,宽,高)。fill 填充颜色,outline,边框颜色

 如上图所示,我们成功将38线找到了,当我越过三八线时,变成为了你。

import tkinter
from tkinter import *


tk = tkinter.Tk()
tk.title("一个窗口")  # 设置窗口名称
tk.geometry("300x300+500+300")
tk.iconbitmap('favicon.ico')
w = tk.winfo_screenwidth()#获取屏幕宽
h = tk.winfo_screenheight()#获取屏幕高
cn=Canvas(tk, height=h, width=w,bg="pink")# bg="pink"

def update_test(e):
    cn.delete(tkinter.ALL)#清除画布内容
    tk.update()
    # 获取屏幕的大小;
    height = tk.winfo_height()
    width = tk.winfo_width()
    # 获取窗体的位置
    x = tk.winfo_x()
    y = tk.winfo_y()
    cn.create_rectangle(0, 0, w / 2 - x, height, fill='red', outline='white')
    cn.pack()
tk.bind("<Configure>", update_test)
tk.mainloop()

思路:添加一个画布,并在画布中画一个矩形,并填充颜色。 宽的计算等于多少呢?

width=w/2-x

w为屏幕的宽,x为坐标的x,也就是窗体的位置坐标横坐标。然后就得到矩形的宽。窗口的高即为矩形的高,也是就得到了这个变化。

第四步:弹窗之哪些隐藏的甜言蜜语

在学习了上面这个技巧之后,我们现在想在桌面上的某一个点来设置我们隐藏的甜言蜜语。有什么好的方法。

继续使用画布的功能。

canvas.create_text(x, y, text='你发现我了',font=3)

 这里的坐标是以窗口的坐标,而不是屏幕的坐标,所以我们还需要进行一次转换。

假如窗口的坐标是(x,y),我们需要的文字显示在(520,520)的位置,那文字应该在画布的那个坐标显示呢?

因为文字的坐标是变动的,于是就有     (520-x,520-y)

(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

代码如下:

import tkinter
from tkinter import *


tk=tkinter.Tk()
tk.title("窗口")#设置窗口名称
tk.geometry("300x300+500+300")
w = tk.winfo_screenwidth()#获取屏幕宽
h = tk.winfo_screenheight()#获取屏幕高
cn=Canvas(tk, height=h, width=w,bg="white")# bg="pink",

def update_test(e):
    cn.delete(tkinter.ALL)#清除画布状态,否则这不会有效果
    tk.update()
    # 获取窗体的位置
    x = tk.winfo_x()
    y = tk.winfo_y()
    cn.create_text(350-x, 300-y, text='你发现我了',font=30)
    cn.pack()
tk.bind("<Configure>", update_test)
tk.mainloop()

 是不是很不错的样子,赶快拿起键盘试一下吧。

第五步:弹窗之哪些隐藏的你的图片

我们已经能把我们喜欢的话“隐藏”起来了,那我现在想隐藏她的一张照片,怎么办呢?我们继续来看。

隐藏照片,这里我们依然应用到画布的功能哦。

image = Image.open("Figure_1.jpg")  # 打开图片
image = image.resize((300, 300))  # 设置图片大小
photo = ImageTk.PhotoImage(image)  # 引入图片
canvas.create_image(x, y, anchor='nw', image=photo)#将图片加入画布,要把图片放到外层,或者是声明全局变量

类似于文字的坐标,我们便可以得到图片的坐标。

(tkinter)撩妹弹窗(3)之不要越过三八线,canvas的使用方法

代码如下:

import tkinter
from tkinter import *
from PIL import ImageTk, Image

tk=tkinter.Tk()
tk.title("窗口")#设置窗口名称
tk.geometry("300x300+500+300")
w = tk.winfo_screenwidth()#获取屏幕宽
h = tk.winfo_screenheight()#获取屏幕高
cn=Canvas(tk, height=h, width=w,bg="white")# bg="pink"
image1 = Image.open("Figure_1.jpg")  # 打开图片
image = image1.resize((300, 300))  # 设置图片大小
photo = ImageTk.PhotoImage(image)  # 引入图片
def update_test(e):
    cn.delete(tkinter.ALL)
    tk.update()
    # 获取屏幕的大小;
    height = tk.winfo_height()
    width = tk.winfo_width()
    # 获取窗体的位置
    x = tk.winfo_x()
    y = tk.winfo_y()
    cn.create_image(500-x, 300-y, anchor='nw', image=photo)
    cn.pack()
tk.bind("<Configure>", update_test)
tk.mainloop()

因为我们的xy是变动的,所以在最大化的时候,我们的图片,文字,都会在对应坐标显示出来,为了增加神秘感,于是,我们增加一个判断。

    if x==-8 and y==-8:pass#最大化的窗口坐标点
    else:
        cn.create_image(500 - x, 300 - y, anchor='nw', image=photo)
        cn.pack()

在最大化的时候,我们什么都不处理。

五、总结

阅读本文,主要了解的是,tkinter的画布功能。画布的创建,画矩形的方法,插入文字的方法,插入图片的方法。以及tkinter窗口改变事件的应用。

cn.create_line(100, 0, 100, 200,fill='red') # 红色直线,画直线
cn.create_rectangle(0, 0,w/2-x, height,fill='#7AC5CD',outline='white')# 画矩形
cn.create_text(550-x, 500-y, text='你发现我了',font=300)#插入文字
cn.create_image(1200-x, 300-y, anchor='nw', image=photo)#插入图片,要把图片放到外层,或者是声明全局变量
tk.bind("<Configure>", update_test)#监听窗口改变事件

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111357.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • ForkJoin看这篇就够了![通俗易懂]

    ForkJoin看这篇就够了![通俗易懂]大家好,我是小黑,一个在互联网苟且偷生的农民工。在JDK1.7中引入了一种新的Fork/Join线程池,它可以将一个大的任务拆分成多个小的任务并行执行并汇总执行结果。Fork/Join采用的是分而治之的基本思想,分而治之就是将一个复杂的任务,按照规定的阈值划分成多个简单的小任务,然后将这些小任务的结果再进行汇总返回,得到最终的任务。分治法分治法是计算机领域常用的算法中的其中一个,主要思想就是将将一个规模为N的问题,分解成K个规模较小的子问题,这些子问题相互独立且与原问题性质相同;求解出子问题的解

  • 使用Redis实现优先级队列

    使用Redis实现优先级队列优先级队列是一种如先进先出队列和堆栈数据结构的抽象数据类型。所不同的是每一个元素关联一个“优先级”。优先级高的元素比优先级低的元素优先得到处理。本文讲解如何基于Redis的SORTEDSET数据类型实现优先级队列。SORTEDSET中元素关联一个SCORE,可以按SCORE有序查询元素。优先级队列基本操作实现如下:is_empty:查看队列是否为空。使用EXISTS命…

  • istio解决了什么问题(istio k8s)

    问题简述通过istio实现灰度发布,浏览器访问报404错误,但是通过curl传递一个Host请求头就能访问成功。问题复现RancherUI界面启动Istio,并开启ingress网关命名空间启动Istio自动注入部署nginx应用###deploy-nginx-v1.yamlapiVersion:apps/v1kind:Deploymentmetadata:labels:app:nginxversion:v1name:nginx-v1n

  • linux下开放oracle1521端口以便于远程连接

    linux下开放oracle1521端口以便于远程连接   1,利用root账号登录linux,输入命令:serviceiptablesstop(先把oracle防火墙给关闭)。   2.输入命令:vi /etc/sysconfig/iptables,在里面添加如下一行:      -A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport …

  • Qemu之Network Device全虚拟方案二:虚拟网卡的创建

    Qemu之Network Device全虚拟方案二:虚拟网卡的创建

  • 自定义控件_绘制太极(拖动)

    自定义控件_绘制太极(拖动)packagecom.example.administrator.houzengyu_0417;importandroid.content.Context;importandroid.graphics.Canvas;importandroid.graphics.Color;importandroid.graphics.Paint;importandroid.graphics

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号