import tkinter as tk
class MyToplevel(tk.Toplevel):
intance = None
def __new__(cls, *args, **kwargs):
if not cls.intance:
cls.intance = super().__new__(cls)
return cls.intance
def __init__(self,master=None):
if hasattr(self,'initialized'):
return
self.initialized = True
super(MyToplevel, self).__init__(master)
self.geometry('400x400+300+100')
self.configure(bg='cyan')
self.protocol("WM_DELETE_WINDOW",self.on_close)
#create widgets
self.create_widgets()
def on_close(self):
self.destroy()
MyToplevel.intance=None
def create_widgets(self):
self.btn = tk.Button(self,text='btn',bg='green',bd=2)
self.btn.pack(side='left',padx=10,anchor='nw')
self.btn2=tk.Button(self,text='stop',bg='yellow',bd=1)
self.btn2.pack(side='left',padx=50,anchor='nw')
if __name__=='__main__':
root=tk.Tk()
root.geometry("500x300")
def fun():
if not MyToplevel.intance:
MyToplevel()
else:
#将窗口最小化还原
MyToplevel.intance.deiconify()
tk.Button(root,text='ui',command=fun).pack(anchor='center')
root.mainloop()
自定义界面
import json
import tkinter as tk
class CustoumeFrame(tk.Frame):
'''提供绘图空间,所有图像在该容器完成'''
def __init__(self,master):
super(CustoumeFrame, self).__init__(master)
self.pack(fill=tk.BOTH,expand='yes')
self.canvas=tk.Canvas(self,bg='gray')
self.canvas.pack(fill=tk.BOTH,expand='yes')
self.drae_circle()
self.move_image()
def drae_circle(self):
self.a=self.canvas.create_oval(10,10,100,120,fill='blue',outline='green')
self.b=self.canvas.create_rectangle(40,40,120,120,fill='green',outline='red')
self.c=self.canvas.create_oval(60,60,200,200,fill='pink')
def clear(self):
if self.a is None:
return
self.canvas.delete(self.a)
def move_image(self):
for i in [self.a,self.b,self.c]:
self.canvas.move(i,10,0)
self.canvas.after(1000,self.move_image)
自定义表格
import tkinter as tk
from tkinter import ttk
class CustomTreeView(ttk.Treeview):
def __init__(self,master,colums,*args,**kwargs):
super(CustomTreeView, self).__init__(master,*args,**kwargs)
self["columns"] = colums
self.column("#0",width=0,stretch=tk.NO) #隐藏第一列
#创建右键菜单
self.popup_menu = tk.Menu(self,tearoff=0)
self.popup_menu.add_command(label='删除选中的行',command=self.__delete_selected_row)
#绑定右键菜单事件
self.bind("",self.__show_pop_menu)
#设置属性和列名
for column in colums:
self.column(column,width=100,anchor=tk.CENTER)
self.heading(column,text=column)
def __show_pop_menu(self,event):
#获取鼠标点击的行
item=self.identify_row(event.y)
if item:
self.selection_set(item)
self.popup_menu.post(event.x_root,event.y_root)
def __delete_selected_row(self):
selected_items=self.selection()
for item in selected_items:
self.delete(item)
def insert_row(self,values):
self.insert("",tk.END,values=values)
def delete_row(self,item):
self.delete(item)
if __name__=="__main__":
root=tk.Tk()
root.geometry("900x800")
cloumns=["ID","姓名","性别","年龄","地址","xuexio"]
tables=CustomTreeView(root,colums=cloumns)
#插入数据
tables.insert_row(("1","张xx","男","38","郑州",'dddd'))
tables.insert_row(("2","张轩萱","女","8","郑州",'aaaa'))
tables.insert_row(("7","徐xx","女","35","郑州",'bbbbb'))
tables.pack()
root.mainloop()
绘制图像
import tkinter as tk
import time
class MyApp(tk.Tk):
def __init__(self):
super(MyApp, self).__init__()
self.geometry('600x500')
self.title='tkinter学习'
self['bg']='gray'
self.counter=tk.IntVar()
self.counter.set(0)
label=tk.Label(self,textvariable=self.counter,font=("楷书",30))
label.pack(side='left',fill='both',expand='yes',padx=5,pady=5)
btn=tk.Button(self,text='click')
btn.pack(side='right',fill='y',anchor='center',pady=5,padx=5)
btn.bind('',self.on_button)
def on_button(self,event):
self.counter.set(self.counter.get()+1)
# time.sleep(1)
self.after(1000,lambda :self.on_button(event))
# self.update()
def move_group(canvas:tk.Canvas,group:list,dx,dy):
for item in group:
canvas.move(item,dx,dy)
def draw_hourse(canvas:tk.Canvas):
points=[(50,250),(350,50),(650,250)]
item1=canvas.create_polygon(points,fill='gray',outline='black',width=10)
item2=canvas.create_rectangle((200,250,500,550),fill='white',outline='black',width=10)
item3=canvas.create_oval((250,300,450,500),fill='yellow',outline='black',width=10)
#把图元放入列表
items=[item1,item2,item3]
return items
if __name__=='__main__':
root=tk.Tk()
root.geometry("800x700")
canvas=tk.Canvas(root,width=700,height=600,bg='cyan')
canvas.pack()
group=draw_hourse(canvas)
move_group(canvas,group,-100,-100)
root.mainloop()
绘制图形
import tkinter as tk
def rotate_taiji(canvas:tk.Canvas,angle):
#清空画布
canvas.delete("all")
x=canvas.winfo_width()//2
y=canvas.winfo_height()//2
#绘制半圆
canvas.create_arc(x-100,y-100,x+100,y+100,start=90+angle,fill='black',outline='black')
canvas.create_arc(x-100,y-100,x+100,y+100,start=270+angle,extent=180,fill='white',outline='white')
#绘制小圆
canvas.create_oval(x-30,y-30,x+30,y+30,fill='black',outline='black')
canvas.create_oval(x-30,y-130,x+30,y-70,fill='white',outline='white')
#更新角度并下一次旋转
angle+=10
canvas.after(10,rotate_taiji,canvas,angle)
root=tk.Tk()
root.geometry("800x700+400+50")
canvas=tk.Canvas(root,width=400,height=400)
canvas.pack()
canvas2=tk.Canvas(root,width=300,height=300,bg='cyan')
canvas2.pack(side=tk.BOTTOM,anchor='w')
rotate_taiji(canvas2,90)
rotate_taiji(canvas,0)
动态图像
import tkinter as tk
def update_rectangle(value):
value = int(value) # 将滑动条的值转换为整数
canvas.coords(rectangle, 0, 200-value, 100, 200)
canvas.itemconfig(rectangle, fill="blue")
if __name__ == "__main__":
root = tk.Tk()
# 创建Canvas组件
canvas = tk.Canvas(root, width=110, height=210)
canvas.pack()
# 绘制矩形
rectangle = canvas.create_rectangle(5, 5, 105, 205, fill="blue")
rec=canvas.create_rectangle(3,3,110,210,outline='red')
# 创建滑动条
scale = tk.Scale(root, from_=0, to=200, orient=tk.HORIZONTAL, command=update_rectangle)
scale.pack()
root.mainloop()