用Tkinter打造GUI开发工具(27)可视化设计及生成代码

116 篇文章 46 订阅
115 篇文章 108 订阅

用Tkinter打造GUI开发工具(27)可视化设计及生成代码

Python有丰富的库,因此能使Tkinter的窗口用程序生成漂亮图形。我们对Tkinter库再次封装HP_tk模块,增加可很多新功能函数。HP_tk模块是小白量化平台的其中一个Tkinter增强模块,京东、淘宝、当当网上购买《零基础搭建量化投资系统——以Python为工具》正版书,赠送小白量化平台全部源代码。

这篇我们介绍正在打造的第二代增强模块HP_tk2,这个是针对商业化小白量化平台的模块,里面除了支持HP_tk的现有模块外,还封装了更高级的模块。例如带行号显示和彩色关键字、支持中文Python语法格式的代码编辑器useredit3模块,仿IPython的useredit2模块等等。
在这里插入图片描述
上图目前是雏形,很多功能没有完成。
此外还增加了可视化设计模块resizewidget模块。有了这些功能,学Python的朋友就有了搭建自己Python程序开发系统的能力,能够DIY自己的Visual Python系统。
在这里插入图片描述
我们下面做一个可视化设计GUI,并且完成生成独立运行代码的验证程序。这个程序使用了HP_tk2模块。

# Tkinter GUI可视化生成代码验证程序.
import tkinter as tk
import tkinter as ttk
import tkinter.tix as tix 
from tkinter.constants import *
import HP_tk2 as htk

s1='''
import tkinter as tk
import tkinter as ttk
import tkinter.tix as tix 
from tkinter.constants import *

root = tix.Tk()   #主窗口root
root.title("可视化设计结果")
'''

s2='''
root.mainloop()
'''

if __name__ == '__main__':
    root = tix.Tk()   #主窗口root
    root.title("可视化设计")
   
    f0=tk.Toplevel(root)  #可视化子窗
    f0.title('弹出窗口')  #Tkinter中设置窗口标题方法
    
    top=htk.resizewidget(f0,800,600)  #建立可调部件区域

    f=tk.Button(top)   #创建一个部件
    f.place(x=30, y=150, width=190, height=100)
    top.setwidget(f)  #加入可调部件
    
    l=tk.Label(top,text='Label')
    l.place(x=130, y=150, width=120, height=30)
    top.setwidget(l)  #加入可调部件

    def btn_cmd():
        print('窗口坐标(%d,%d)'%(f0.winfo_x(),f0.winfo_y()))
        print('窗口宽高(%d,%d)'%(f0.winfo_width() ,f0.winfo_height()))
        print('\n部件1坐标')
        x,y,width,height=top.readplace(top.win[0])
        print('组件坐标:',x,y)
        print('组件宽高:',width ,height)
        print('\n部件2坐标')
        x,y,width,height=top.readplace(top.win[1])
        print('组件坐标:',x,y)
        print('组件宽高:',width ,height)
        s=s1+'\n'
        ss="root.geometry(\'{}x{}+{}+{}\'.format(%d,%d, %d, %d))  #改变窗口位置和大小"%(f0.winfo_width(),\
            f0.winfo_height(),f0.winfo_x(),f0.winfo_y())
        s=s+ss+'\n'
        for i in range(top.m):
            x,y,width,height=top.readplace(top.win[i])
            w=top.readwidget(top.win[i])
            if w=='Label':
                ss='f%d=tk.%s(root,text=\'label%d\')'%(i,w,i)
            else:
                ss='f%d=tk.%s(root)'%(i,w)
            s=s+ss+'\n'
            ss='f%d.place(x='%i
            ss=ss+x+',y='+y+',width='+width+' ,height='+height+')'
            s=s+ss+'\n'
        s=s+s2
        print('\n生成代码:\n')
        print(s)

    btn=tk.Button(root,text='生成代码',command=btn_cmd)
    btn.place(x=10,y=10)
    root.mainloop()

程序运行结果如下图。
在这里插入图片描述
我们调整窗口大小以及上面控件的位置,如下图。
在这里插入图片描述
点击按钮[生成代码],生成如下的代码。

import tkinter as tk
import tkinter as ttk
import tkinter.tix as tix 
from tkinter.constants import *

root = tix.Tk()   #主窗口root
root.title("可视化设计结果")

root.geometry('{}x{}+{}+{}'.format(395,122, 475, 886))  #改变窗口位置和大小
f0=tk.Button(root)
f0.place(x=7,y=8,width=190 ,height=100)
f1=tk.Label(root,text='label1')
f1.place(x=221,y=42,width=141 ,height=31)

root.mainloop()

这段代码运行结果如下图。
在这里插入图片描述
这个图形是不是跟我们上面设计的一致呢?
最近休假在家有时间,我打算再写一本书Tkinter高级教程,暂定书名《Python Tkinter可视化开发技术》,HP_tk2库将随这本书为大家提供。

对于不熟悉Python、Tkinter、Ttk、Tix技术的朋友,可在京东和淘宝上购买正版书《零基础搭建量化投资系统——以Python为工具》。这本书书的“第8章 视窗程序开发模块Tkinter”,介绍了入门知识,看懂后,可以通过百度搜索来学习更多Tkinter知识。

《零基础搭建量化投资系统——以Python为工具》
第8章 视窗程序开发模块Tkinter
8.1 Tkinter的使用
8.2 小部件的标准属性
8.2.1 Tkinter控件的属性
8.2.2 Tkinter控件属性的值和单位
1. 维度单位
2. 坐标系统
3. 颜色
4. 字体类型
5. 对齐方式
6. 浮雕风格
7. 位图
8. 鼠标样式
9. 图片
8.3 Tkinter主窗口
8.4 Toplevel顶层子窗口
8.5 创建窗口菜单
8.6 创建弹出菜单
8.7 控件的几何布局管理方法
1. 控件的pack布局
2. 控件的grid布局
   3. 控件的place布局
8.8 Tkinter常用控件
1. Label控件
2. Frame控件
3. Button控件
4. Entry控件
5. 工具条和状态栏
6. Text控件
7. Scrollbar控件
8. Canvas控件
8.9 Tkinter的事件
1. 事件名称
2. 事件类型
3. 事件修饰符
4. 编写事件处理程序
8.10 Tkinter的主题控件Ttk
1. ttk.Notebook控件
2. ttk.Treeview控件
8.11 Tkinter的扩展控件Tix
1. 使用Tix
2. 表格几何管理器Form
3. tix.Balloon气球窗口小部件
4. tix.ButtonBox按钮框
5. tix.ComboBox组合框控件
6. tix.Control控制窗口

如遇不明白的Tkinter问题,可以在读者群中咨询作者。

这是一个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
好的,我可以为您提供一个使用Python的GUI界面和数据可视化的爬虫示例。这个示例使用了tkinter库来创建GUI界面,matplotlib库来进行数据可视化,以及requests和beautifulsoup4库来进行网页爬取。 以下是示例代码: ```python import tkinter as tk from tkinter import messagebox import requests from bs4 import BeautifulSoup import matplotlib.pyplot as plt import numpy as np # 创建GUI界面 root = tk.Tk() root.title("天气预报") # 创建GUI界面元素 city_label = tk.Label(root, text="城市代码:") city_label.pack(side=tk.LEFT) city_entry = tk.Entry(root) city_entry.pack(side=tk.LEFT) query_button = tk.Button(root, text="查询") # 定义查询函数 def query_weather(): city_code = city_entry.get() if not city_code: messagebox.showerror("错误", "请输入城市代码!") return url = 'http://www.weather.com.cn/weather/{}.shtml'.format(city_code) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') weather_div = soup.find(id='7d') if not weather_div: messagebox.showerror("错误", "未找到城市天气信息!") return ul = weather_div.find('ul') li_list = ul.find_all('li') city_name = li_list[0].text weather = li_list[1].text temp = li_list[2].text wind = li_list[3].text aqi = li_list[7].text # 在GUI界面上显示天气信息 result_text.delete(1.0, tk.END) result_text.insert(tk.END, "城市:{}\n天气:{}\n温度:{}\n风力:{}\n空气质量:{}".format(city_name, weather, temp, wind, aqi)) # 绘制温度变化曲线 temp_list = [] for i in range(1, 8): day_temp = soup.find('p', class_='tem').find_all('span')[i].text.strip() temp_list.append(int(day_temp)) plt.clf() plt.plot(np.arange(1, 8), temp_list) plt.xlabel("日期") plt.ylabel("温度(℃)") plt.title("未来7天温度变化曲线") plt.show() # 将查询函数绑定到按钮上 query_button.config(command=query_weather) query_button.pack(side=tk.LEFT) # 创建GUI界面元素 result_text = tk.Text(root, width=50, height=10) result_text.pack() # 运行GUI界面 root.mainloop() ``` 在这个示例中,我们创建了一个简单的GUI界面,包括一个文本框用于输入城市代码,一个查询按钮,和一个文本框用于显示天气信息。当用户点击查询按钮时,程序会根据输入的城市代码爬取天气信息,并在GUI界面上显示出来。同时,程序还会绘制未来7天温度变化曲线,并使用matplotlib库在一个新窗口中展示出来。 你可以根据自己的需要对代码进行修改和优化,以实现更加完善的GUI界面和数据可视化效果。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荷蒲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值