(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)#监听窗口改变事件

 

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • latex大括号错位显示_LaTeX表格

    latex大括号错位显示_LaTeX表格amsmath中\smash妙用样例-大括号错位显示。原始大括号显示\[\text{机器学习}\begin{cases}\text{~~监督学习~}{\begin{cases}\text{回归算法}\\\text{分类算法}{\begin{cases}\text{生成模型}\\\text{判别模型}\end{cases}}

    2022年10月11日
  • LSTM时间序列预测及网络层搭建[通俗易懂]

    最近看到一篇博客,是时间预测问题,数据和代码的原地址在这里,https://www.jianshu.com/p/5d6d5aac4dbd下面只是对其复现和思考:首先关于数据预处理的问题,大家可以参考:https://blog.csdn.net/lilong117194/article/details/82911073这里的问题是:给你一个数据集,只有一列数据,这是一个关于时间序列的数据,从…

    2022年4月7日
  • C#调用windows api示例

    这是运行结果:Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提 供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能

    2021年12月21日
  • asp中的session使用方法

    asp中的session使用方法Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器

    2022年7月1日
  • PHP smarty

    PHP smarty<?php/*一、什么是smarty?smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的

    2022年7月1日
  • NodeJS环境下使用axios上传文件

    NodeJS环境下使用axios上传文件最近有个需求,需要在nodejs后端上传图片到云存储服务器,刚好对axios这个库比较熟悉,因此便开始在网上查资料,但是网上大多的都是用axios在前端上传文件的代码,即是基于浏览器环境的。后来找到了基于Nodejs环境的axios上传代码,一番copy后便开始了测试,本以为会一帆风顺,没想到服务器那边却总是返回如下错误,也就是说我们的请求并没有以multipart/form-data的形式封装好…

    2022年6月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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