独书先生 Menu

Viewing all items for tag tkinter

Python Tkinter 表格组件

需求

我想在 tkinter 做的 python GUI 程序中加入一个表格,由于官方库没有表格这个组件,只能找社区组件或者自己造一个表格组件。

方案一

通过 grid 布局功能,造一个简单的表格。缺点是和其他组件配合构造 GUI 就不太方便。

使用

from tkinter import *

root = Tk()

height = 10
width = 5
cells = {}
for i in range(height): #Rows
    for j in range(width): #Columns
        b = Entry(root, text="")
        b.grid(row=i, column=j)
        cells[(i,j)] = b

mainloop()

方案二

采用社区已有组件 tksheet,一个用 tkinter canvas 手动绘制的表格

github 地址:https://github.com/ragardner/tksheet

支持多达数亿个单元格的大数据渲染,只重绘表格的可见部分,所以能运行得相当流畅。

还支持单元格颜色和背景。

使用

确保 Python 3.6+版本,安装依赖

pip install tksheet

使用

from tksheet import Sheet
import tkinter as tk


class demo(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.grid_columnconfigure(0, weight = 1)
        self.grid_rowconfigure(0, weight = 1)
        self.frame = tk.Frame(self)
        self.frame.grid_columnconfigure(0, weight = 1)
        self.frame.grid_rowconfigure(0, weight = 1)
        self.sheet = Sheet(self.frame,
                           data = [[f"Row {r}, Column {c}\nnewline1\nnewline2" for c in range(50)] for r in range(500)])
        self.sheet.enable_bindings()
        self.frame.grid(row = 0, column = 0, sticky = "nswe")
        self.sheet.grid(row = 0, column = 0, sticky = "nswe")


app = demo()
app.mainloop()

tksheet

参考

实现人手一个冰墩墩python画冰墩墩源码

背景

最近北京冬奥会正在举行,北京冬奥会的吉祥物“冰墩墩”非常抢手,很多朋友连夜排队都抢不到一个冰墩墩。

冰墩墩实在太火了,为了实现冰墩墩自由、“人手一墩”的梦想,强大的程序员GG奉上了一个用Python绘制冰墩墩的程序,先看下面这个动图体会下

真是太强大了,网友真是无所不能

思路和代码

技术上主要用到了python的turtle和tkinter模块,这两个模块都是Python内置的模块,非常强大。

  • turtle用来绘图,有多种绘制方式和样式
  • tkinter用来构建GUI程序,也内置了许多组件

主程序基本上就是采用turtle,设置不同的画笔和路径等绘制方式,一笔一笔接着在初始化好的tkinter Canvas画布上画出来的。核心功能也就完成了。

先启动一个tkinter界面,放置一个Canvas画布,再将turtle绘制区域设置到这个Canvas上

root = Tk()
root.geometry('600x700+500+60')
root.config(bg='white')
root.title('lwebapp.com')
root.resizable(False, False)
canvas = Canvas(root, width=600, height=600)
canvas.place(x=0,y=50)

t = RawTurtle(canvas)
t.hideturtle()

完整的代码到源码的main.py(https://github.com/openHacking/TKinter-UI/blob/main/demo/draw_bdd/main.py)文件查看

接着就是核心的绘制代码,由于代码太长这里贴出一部分

def draw_bdd(t):

    # reset
    t.penup()
    t.home()
    t.clear()

    # adjust the speed
    t.speed(30)

    # left hand
    t.goto(177, 112)

    t.pencolor("lightgray")

    t.pensize(3)

    t.fillcolor("white")

    t.begin_fill()

    t.pendown()

    t.setheading(80)

    t.circle(-45, 200)

    t.circle(-300, 23)

    t.end_fill()

完整的代码到源码的draw.py(https://github.com/openHacking/TKinter-UI/blob/main/demo/draw_bdd/draw.py)文件查看

最后,用 pytxui 这个python GUI组件库放了两个样式更美观的按钮做重新绘制和下载功能。

下载功能用到了Pillow的ImageGrab截图功能,可以将Canvas上的冰墩墩绘制结果保存为一张PNG图片。

核心的截图保存代码

from PIL import ImageGrab
import os

def save_image(root,widget):
    root.update()
    x=root.winfo_rootx()+widget.winfo_x()
    y=root.winfo_rooty()+widget.winfo_y()

    x1=x+widget.winfo_width()
    y1=y+widget.winfo_height()
    offset = 4
    ImageGrab.grab().crop((x + offset,y + offset,x1 - offset,y1 - offset)).save(os.getcwd() + "\\bdd.png", "PNG")

源码

pytxui-draw_bdd (https://github.com/openHacking/TKinter-UI/tree/main/demo/draw_bdd)

总结

以上我们结合当前大火的冰墩墩学习到了Python相关的知识

  • turtle和tkinter结合使用构造GUI
  • 如何构造一个漂亮的GUI按钮组件
  • 如何将tkinter Canvas画布下载为图片

其中还有很多不足,欢迎给作者多提建议和想法,一起学习提高。

参考

  • pytxui (https://github.com/openHacking/TKinter-UI)