tkinter界面设计

        走在楼间,阳光透过窗户洒在了楼道里,伴随着丝丝冷意,侵进了我的身体。恍惚间,想起了前几年在白纸上写下的一句话:晨光曦曦,映我心田;现在的我却想到的是;外面的阳光正好,而我却把自己锁在了牢笼里,套上了枷锁,躲在了角落里,只有当光移过来时,我才看见它。

软件:PyCharmEAP
语言:Python
作者:落寞红颜玉玫瑰
时间:立冬——闭塞而成冬(十月获稻,葭月潜龙,腊月嘉年)

效果展示

TKINTER界面

目录

1、TKINTER界面设计

2、界面背景实时刷新


首先导入所需要的模块。

import os
import random
import string
import tkinter
import tkinter.messagebox
from PIL import Image, ImageTk
# 这个是我自己的代码模块包,不是系统或者库里的,按照自己实际需求引入。
from my_module_packages import getImage

1、TKINTER界面设计

1、大体页面设计

标题,最大化与最小化及打开界面大小设计,顺带设置一个图标

# 框架构建
root = tkinter.Tk()
root.title("TKINTER界面优化")
root.geometry("600x500+100+100")
root.minsize(300, 250)
root.maxsize(600, 500)
root.iconbitmap(r"C:\Users\JZ\Desktop\work\已完成项目\sendMes\gui.ico")

2、放入框架

方便本文展示,本文放入了两个框架,如若框架更多,或没有,则需要更改后面代码,这部分不难,主代码出来后,可自行更改。

# 分区,分为按钮区和输出区
frame1 = tkinter.Frame(root)
frame2 = tkinter.Frame(root)
frame1.place(relx=0.05, rely=0.05, relwidth=0.4, relheight=0.9)
frame2.place(relx=0.55, rely=0.05, relwidth=0.4, relheight=0.9)

3、加入组件

给第一个框架放入一个按钮,一个文本框,也可以加入其他组件。

f1_label = tkinter.Label(frame1, anchor="nw")
f1_label.place(relx=0, rely=0, relwidth=1, relheight=1)
f2_label = tkinter.Label(frame2, anchor="nw")# image=image2[0]
f2_label.place(relx=0, rely=0, relwidth=1, relheight=1)

button1 = tkinter.Button(frame1, compound="center", text="展示按钮1",
                         font=(u"楷体", 30), relief=tkinter.FLAT,
                         borderwidth=0, justify="center",
                         anchor="center", activebackground="purple")
button1.place(relx=0.2, rely=0.1, relwidth=0.6, relheight=0.1)

button2 = tkinter.Label(frame1, compound="center", text="实验文本框",
                         font=(u"楷体", 30), relief=tkinter.FLAT,
                         borderwidth=0, justify="center",
                         anchor="center", activebackground="purple")
button2.place(relx=0.2, rely=0.3, relwidth=0.6, relheight=0.1)

4、运行主函数

第二部分的主要内容。

getImage.gen(root)

5、进入消息循环

root.mainloop()

2、界面背景实时刷新

1、导入文件

可按照实际需求自行添加。

# "根路径选择:选择一个放图片的文件夹,最好使用绝对路径。"
ROOTPATH = "C:\\Users\\JZ\\Desktop\\work\\每日报表_pycharm\\images"

2、读取图片列表

随机选择图片,本文两个框架,所以选取两张,如果框架较多,可用循环函数生成。

# 输出当前路径下的所有文件,需要全是图片相关格式。
images = os.listdir(ROOTPATH)

# 随机选择目标文件夹中的图片。
# 利用随机函数,来选取本次的图片。
path = ROOTPATH + "\\" + random.choice(images)
# 选取两张图片,因为本例中有俩frame。
path2 = ROOTPATH + "\\" + random.choice(images)
# 打开当前选择的图片
img1 = Image.open(path)
# 打开第二张图片,若不需要,注释掉即可。
img2 = Image.open(path2)
# 若是多个图片背景,则需要生成列表,方便选取
img_list = [img1, img2]

# 循环函数选择图片,将n换为需要的数目就可以了。
# img_list = [Image.open(ROOTPATH + "\\" + random.choice(images)) for i in range(n)]

3、更新背景

# 循环函数,用after来递归,进行刷新。
def gen(root) -> {ImageTk.PhotoImage}:
    """
    :param root: 定级路径。
    :return: 无返回值,背景就是返回值了。
    """
    # 获得当前框架的宽和高。
    now_size = root.wm_geometry().split("+")[0].split("x")
    # 主函数,用来重新配置 image。
    choice(root, now_size)
    # 利用after函数刷新,空间间隔是100毫秒。
    root.after(100, gen, root)

4、更新背景

在这儿,如果界面全是frame框架的话,则可以直接用,只要img_list元素对应就可以就可以。如若没有frame框架,则去掉frame框架判断即可,若是frame和其他组件(比如button,label等)时,则需要增加else条件。

def choice(root, now_size):
    """
    :param root: 定级路径。
    :param now_size: 当前框架的尺寸。
    :return:刷新的界面就是返回值。
    """
    # 查看根路径下面有啥元素,如果是frame,则不会又image属性,但其子元素需要。
    # 开始索引为0。
    index = 0
    for item in root.winfo_children():
        # 得到当前所要使用的图片。
        img = img_list[index]
        # 如果是此元素,则需要循环更新背景图片。
        if "frame" in str(item):
            # 获得当前框架的宽和高,作为当前框架内的基础数据。
            wid, hei = float(now_size[0]) * float(place(item)[2]), float(now_size[1]) * float(place(item)[3])
            # 缩放因子选择,选择最大的做为缩放因子,铺满框架,选择最小的则不改变图片视觉。
            resize_factor = max([wid / img.size[0], hei / img.size[1]])
            # 将图片的大小调成与当前框架相符!
            new_img = img.resize((int(img.size[0] * resize_factor), int(img.size[1] * resize_factor)))

            # 在当前框架内,调整子元素的大小,使其适应当前tkinter的大小。
            for child in item.winfo_children():
                # 裁剪图片,获得左上角与右下角的坐标(相对于当前框架)。
                x1, y1 = wid * float(place(child)[0]), hei * float(place(child)[1])
                x2, y2 = wid * (float(place(child)[0]) + float(place(child)[2])), hei * (
                        float(place(child)[1]) + float(place(child)[3]))
                image1 = new_img.crop((x1, y1, x2, y2))
                # 将其转换为可用于的图片。
                image = ImageTk.PhotoImage(image1)
                # 将图片配置到框架。
                child.configure(image=image)
                # 调节字体,使其相对于当前页面大小。
                child.config(font=(u"楷体", int(hei * 0.05)))
                # 这行代码防止页面闪烁。
                child.image = image

        # 对于多个框架背景选取不同图片的设置
        index += 1

5、用来获取子元素相关信息,来做假透明背景

def place(child) -> {tuple[str, str, str, str]}:
    """
    :param child: 输入元素。
    :return:返回一个tup,其四个元素是relx,rely,relwidth,relheight。
    """
    # 获得当前元素的相对位置,及相对大小。
    place_info: tuple[string, ...] = tuple(
        [child.place_info()["relx"],
         child.place_info()["rely"],
         child.place_info()["relwidth"],
         child.place_info()["relheight"]])
    return place_info

山有木兮木有枝,心悦君兮君不知。——佚名《越人歌》

这是一个VB6的IDE插件(Addin),使用VB6的IDE直接设计Python的界面。 Python和VB都是能让人快乐的编程语言,我使用了Python之后,很多自己使用的工具都使用Python开发或改写了,因为最终实现的Python代码实在太短了(相比VB),有时候Python一行代码就可以实现VB一个函数的功能。 Python就是这种让人越用越开心的语言。 不过说实在,使用Python开发GUI界面还是麻烦了一些了,自带的标准库Tkinter使用起来非常简单,不过对于习惯了VB拖放控件完成界面设计的同学来说,还是不够人性化。TK也有一个工具叫GUI Builder,不过它使用Layout布局,不够直观,而且界面简陋,用起来也不爽。 至于PyQt/wxPython等GUI库,尽管有可视化设计工具,但总感觉做一般的轻量级应用是杀鸡用牛刀,学习起来也比较复杂,而且不够环保,不够低碳,要带一个很大的库,需要目标机器上夜同样安装了PyQt/wxPython,做不了绿色软件。 所以最终的结果是我更喜欢Tkinter,用起来很简单,绿色环保,真正的跨平台,一个py文件到处运行(担心泄密就编译成pyc)。 很多人都认为TK的界面不够美观,不过导入Python自带的标准TTK主题库,界面非常Native,不输PyQt/wxPython。 此Addin默认启用TTK支持,也可选择关闭。 总而言之,轻量级GUI,TK+TTK足够。 使用此Addin,你可以不用写一句代码就可以生成一个完整可运行的Python的GUI界面,支持python 2.X和3.X。 安装方法:将压缩包解压到你希望的目录,然后执行Setup.exe完成注册插件过程,打开VB6就可以用了。 在VB窗体上设计完成界面后(你可以大胆的设置各控件的属性,Addin尽量将其翻译为tkinter的控件属性),点工具栏上的VisualTkinter(图标为一片橙红色羽毛),再点'生成代码'按钮,即可生成可运行的Python代码,可以拷贝至剪贴板或保存至文件。 一般情况下你可以不用再改变tkinter的控件属性,但是如果你熟悉tkinter,需要更多的控制,可以一一核对各属性,并且修改,再生成代码。 除了用来设计界面外,此ADDIN内置的各控件属性列表可以做为编程参考,比较完整,除了极少数我认为大多数人都不用的属性外,属性定义基本上是我从官方的tkinter文档直接翻译的。 如果还没有VB6,网上找一个VB6精简版即可(建议使用12M的版本,6M的版本也可以使用,不过工具栏图标无法显示,可以通过菜单执行此插件)。 经过网友测试,完美支持WinXP,Windows 7, Windows 8。
这是一个VB6的IDE插件(Addin),使用VB6的IDE直接设计Python的界面。 Python和VB都是能让人快乐的编程语言,我使用了Python之后,很多自己使用的工具都使用Python开发或改写了,因为最终实现的Python代码实在太短了(相比VB),有时候Python一行代码就可以实现VB一个函数的功能。 Python就是这种让人越用越开心的语言。 不过说实在,使用Python开发GUI界面还是麻烦了一些了,自带的标准库Tkinter使用起来非常简单,不过对于习惯了VB拖放控件完成界面设计的偶来说,还是不够人性化。TK也有一个工具叫GUI Builder,不过它使用Layout布局,不够直观,而且用起来很不爽。。 至于PyQt/wxPython等GUI库,尽管有可视化设计工具,但总感觉做一般的轻量级应用是杀鸡用牛刀, 而且不够环保,不够低碳,要带一个很大的库,需要目标机器上夜同样安装了PyQt/wxPython,做不了绿色软件。 所以最终的结果是我更喜欢Tkinter,用起来很简单,绿色环保,真正的跨平台,一个py文件到处运行(担心泄密就编译成pyc)。 很多人都认为TK的界面不够美观,不过我经过多次实验后发现导入Python自带的标准TTK主题库,界面非常Native,不输PyQt/wxPython。 此Addin默认启用TTK支持,也可选择关闭。 总而言之,轻量级GUI,TK+TTK足够。 使用此Addin,你可以不用写一句代码就可以生成一个完整可运行的Python的GUI界面,支持2.X和3.X。 安装方法:将压缩包解压到你希望的目录,然后执行Setup.exe完成注册插件过程,打开VB6就可以用了。 在VB窗体上设计完成界面后(你可以大胆的设置各控件的属性,Addin尽量将其翻译为tkinter的控件属性),点工具栏上的VisualTkinter(图标为一片羽毛),再点'生成代码'按钮,即可生成可运行的Python代码,可以拷贝至剪贴板或保存至文件。 一般情况下你可以不用再改变tkinter的控件属性,但是如果你熟悉tkinter,需要更多的控制,可以一一核对各属性,并且修改,再生成代码。 当然除了用来设计界面外,此ADDIN内置的各控件属性列表可以做为编程参考,比较完整,除了极少数我认为大多数人都不用的属性外,属性定义基本上是我从官方的tkinter文档直接翻译的。 如果还没有VB6,网上找一个VB6精简版即可,不到20M,小巧玲珑。 代码已经在Github上托管,更新的版本可以在这上面找到,需求也可以在上面提: https://github.com/cdhigh/Visual-Tkinter-for-Python
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落寞红颜玉玫瑰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值