TCL/TK GUI in Python 浅试笔记

TK GUI 学习

Tk 使用单线程、事件驱动的编程模型.
所有 GUI 代码、事件循环和 应用程序在同一线程中运行。因此,强烈建议不要进行任何阻止事件处理程序的调用或计算。

耗时操作的处理:

  1. 如果需要从另一个线程与运行 Tkinter 的线程进行通信,请尽可能保持简单。
    root.event_generate("<<MyOwnEvent>>") 将虚拟事件发布到 Tkinter 事件队列,然后在代码中处理该事件。
  2. 也可以在长时间的callback中,自己维护一个事件循环。

https://tkdocs.com/
https://oooutlk.github.io/tk/

个人感受:

TK来自于TCL,用来做小工具UI和脚本语言的UI是很不错的。
如果想要好的UI,大规模程序,现代化的IDE支持,建议选择其他GUI框架。

Python

Calculate

from tkinter import *
from tkinter import ttkroot = Tk()
root.title("温度换算工具")# main frame
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))# 设置权重,拉伸
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)# row 1
feet = StringVar(value='30')
feet_entry = ttk.Entry(mainframe, width=7, textvariable=feet)
feet_entry.grid(column=2, row=1, sticky=(W,E))
ttk.Label(mainframe, text=C').grid(column=3, row=1, sticky=(W,E))# row 2
ttk.Label(mainframe, text='is equivalent to').grid(column=1, row=2, sticky=E)
meters = StringVar()
ttk.Label(mainframe, textvariable=meters).grid(column=2, row=2, sticky=(W,E))
ttk.Label(mainframe, text=F').grid(column=3, row=2, sticky=W)# row 3
def btn_calculate(*args):val = float(feet.get())meters.set(val*1.8+32)ttk.Button(mainframe, text='Calculate', command=btn_calculate).grid(column=3, row=3, sticky=W)# layout 
for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)# focus
feet_entry.focus()# key binding
root.bind("<Return>", btn_calculate)root.mainloop()########### class version #############from tkinter import *
from tkinter import ttkclass CalculateGUI:def __init__(self, root: Tk) -> None:root.title("温度换算工具")# main framemainframe = ttk.Frame(root, padding="3 3 12 12")mainframe.grid(column=0, row=0, sticky=(N, W, E, S))root.columnconfigure(0, weight=1)root.rowconfigure(0, weight=1)# row 1self.feet = StringVar(value='26.3')feet_entry = ttk.Entry(mainframe, width=7, textvariable=self.feet)feet_entry.grid(column=2, row=1, sticky=(W,E))ttk.Label(mainframe, text=C').grid(column=3, row=1, sticky=(W,E))# row 2ttk.Label(mainframe, text='is equivalent to').grid(column=1, row=2, sticky=E)self.meters = StringVar()ttk.Label(mainframe, textvariable=self.meters).grid(column=2, row=2, sticky=(W,E))ttk.Label(mainframe, text=F').grid(column=3, row=2, sticky=W)# row 3ttk.Button(mainframe, text='Calculate', command=self.btn_calculate).grid(column=3, row=3, sticky=W)# layout for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)# focusfeet_entry.focus()# key bindingroot.bind("<Return>", self.btn_calculate)def btn_calculate(self, *args):val = float(self.feet.get())self.meters.set(val*1.8+32)if __name__ == '__main__':root = Tk()CalculateGUI(root)root.mainloop()

Widget

  1. https://tcl.tk/man/tcl8.6/TkCmd/contents.htm
  2. https://tcl.tk/man/tcl8.6/TkCmd/ttk_widget.htm
# 三种方式修改属性
button = ttk.Button(root, text="Hello", command="buttonpressed")
button['text'] = 'goodbye'
button.configure('text')# list all
button.configure()

widget的几个方法:

  • winfo_class: 标识小部件类型的类,例如,主题按钮TButton
  • winfo_children: 作为层次结构中小组件的直接子级的小组件列表
  • winfo_parent: 层次结构中小组件的父级
  • winfo_toplevel: 包含此小组件的顶级窗口
  • winfo_width, winfo_height: 小部件的当前宽度和高度;在屏幕上出现之前不准确
  • winfo_reqwidth, winfo_reqheight: “几何管理器”(Geometry Manager) 的微件请求的宽度和高度
  • winfo_x, winfo_y: 小组件左上角相对于其父项的位置
  • winfo_rootx, winfo_rooty: 小组件左上角相对于整个屏幕的位置
  • winfo_vieweable: 小组件是显示还是隐藏(其在层次结构中的所有祖先必须可查看才能查看)
事件循环:
from tkinter import *
from tkinter import ttk
root = Tk()
l =ttk.Label(root, text="Starting...")
l.grid()
l.bind('<Enter>', lambda e: l.configure(text='Moved mouse inside'))
l.bind('<Leave>', lambda e: l.configure(text='Moved mouse outside'))
l.bind('<ButtonPress-1>', lambda e: l.configure(text='Clicked left mouse button'))
l.bind('<3>', lambda e: l.configure(text='Clicked right mouse button'))
l.bind('<Double-1>', lambda e: l.configure(text='Double clicked'))
l.bind('<B3-Motion>', lambda e: l.configure(text='right button drag to %d,%d' % (e.x, e.y)))
root.mainloop()

事件List:

  • : 窗口已变为活动状态。
  • : 窗口已停用。
  • : 鼠标上的滚轮已移动。
  • : 键盘上的键已被按下。
  • : 密钥已发布。
  • : 已按下鼠标按钮。
  • : 鼠标按钮已松开。
  • : 鼠标已移动。
  • : 小组件已更改大小或位置。
  • : 小部件正在被销毁。
  • : 小部件已获得键盘焦点。
  • : Widget 已失去键盘焦点。
  • : 鼠标指针进入小部件。
  • : 鼠标指针离开小部件。
  • keyboard bind: https://tcl.tk/man/tcl8.6/TkCmd/keysyms.htm

也可以bind和产生自己的虚拟event: root.event_generate("<<MyOwnEvent>>")

mutable value
s = StringVar(value="abc")   # default value is ''
b = BooleanVar(value=True)   # default is False
i = IntVar(value=10)         # default is 0
d = DoubleVar(value=10.5)    # default is 0.0
width/height
f['width'] = 350   # pixels
f['width'] = 350c   # 厘米
f['width'] = 350m   # 毫米
f['width'] = 350i   # 英寸
f['width'] = 350p   # point
Padding
f['padding'] = 5           # 5 pixels on all sides
f['padding'] = (5,10)      # 5 on left and right, 10 on top and bottom
f['padding'] = (5,7,10,12) # left: 5, top: 7, right: 10, bottom: 12
border
frame['borderwidth'] = 2
frame['relief'] = 'sunken'
style
s = ttk.Style()
s.configure('Danger.TFrame', background='red', borderwidth=5, relief='raised')
ttk.Frame(root, width=200, height=200, style='Danger.TFrame').grid()
widget - label
# 静态文本
label = ttk.Label(parent, text='Full name:')# 动态
resultsContents = StringVar()
label['textvariable'] = resultsContents
resultsContents.set('New value to display')# 图像
image = PhotoImage(file='myimage.gif')
label['image'] = image# font
# 一般是通过style改变一类,也可以单独设置
label['font'] = "TkDefaultFont"
label['foregroundbackgroundred'] = "#ff340a"# layout
grid, sticky# multi-line
label['text'] = 'abc\n123'  # 强制换行
label['wraplength'] = 5     # 自动换行
widget - button
action = ttk.Button(root, text="Action", default="active", command=myaction)
root.bind('<Return>', lambda e: action.invoke())# state
b.state(['disabled'])          # set the disabled flag
b.state(['!disabled'])         # clear the disabled flag
b.instate(['disabled'])        # true if disabled, else false
b.instate(['!disabled'])       # true if not disabled, else false
b.instate(['!disabled'], cmd)  # execute 'cmd' if not disabled
widget - checkbutton
measureSystem = StringVar()
check = ttk.Checkbutton(parent, text='Use Metric', command=metricChanged, variable=measureSystem,onvalue='metric', offvalue='imperial')# state
check.instate(['alternate'])   # 三态state
widget - radiobutton
# 一组 radio button
phone = StringVar()
home = ttk.Radiobutton(parent, text='Home', variable=phone, value='home')
office = ttk.Radiobutton(parent, text='Office', variable=phone, value='office')
cell = ttk.Radiobutton(parent, text='Mobile', variable=phone, value='cell')
widget - entry/input
username = StringVar()
name = ttk.Entry(parent, textvariable=username)# change it
print('current value is %s' % name.get())
name.delete(0,'end')          # delete between two indices, 0-based
name.insert(0, 'your name')   # insert new text at a given index# watch value change
def it_has_been_written(*args):pass
username.trace_add("write", it_has_been_written)  # trace_remove, trace_info# password
passwd = ttk.Entry(parent, textvariable=password, show="*")# validate TODO
widget - Text

多行编辑框

t = Text(root, width=40, height=10)txt['state'] = 'disabled'# pos format: linenum.charnum
t.index('2.1') # cur move
t.see('2.1')   # view 移动到第二行,第一列t.insert/delete # 插入,删除
thetext = text.get('1.0', 'end')  # scroll 
t = Text(root, width = 40, height = 5, wrap = "none")
ys = ttk.Scrollbar(root, orient = 'vertical', command = t.yview)
xs = ttk.Scrollbar(root, orient = 'horizontal', command = t.xview)
t['yscrollcommand'] = ys.set
t['xscrollcommand'] = xs.set# image
flowers = PhotoImage(file='flowers.gif')
text.image_create('sel.first', image=flowers)# widget 
b = ttk.Button(text, text='Push Me')
text.window_create('1.0', window=b)
widget - combox
countryvar = StringVar()
country = ttk.Combobox(parent, textvariable=countryvar)# 可选内容
country['values'] = ('USA', 'Canada', 'Australia')
country.state(["readonly"])  # 不能随意填写,只能选择# selected
country.bind('<<ComboboxSelected>>', function)# index current
country.current   # 0 based index
widget - listBox
choices = ["apple", "orange", "banana"]
choicesvar = StringVar(value=choices)
l = Listbox(parent, height=10, listvariable=choicesvar)# 动态改变可选内容
choices.append("peach")
choicesvar.set(choices)# 单选,多选
l.configure('selectmode', 'browse')  # extended 多选if lbox.selection_includes(2): ...  # 2 是否选中lbox.selection_set(idx)  # 选中 index
lbox.see(idx)  # index move 到可见范围# 事件绑定
lbox.bind("<<ListboxSelect>>", lambda e: updateDetails(lbox.curselection()))  # When a user changes the selection
lbox.bind("<Double-1>", lambda e: invokeAction(lbox.curselection())) # mouse double-click
widget - Scrollbar

tk的scrollbar 都是单独的,不是widget的一部分。需要手动代码绑定。

s = ttk.Scrollbar( parent, orient=VERTICAL, command=listbox.yview) # Every widget that can be scrolled vertically includes a method named yview# 关联listbox item数量与scrollbar的滚动范围
listbox.configure(yscrollcommand=s.set)
l['yscrollcommand'] = s.set# 主动scroll
s.set(0.25, 0.26)  # 0~1 之间
widget - Scale

缩放,或者进度表示

# label tied to the same variable as the scale, so auto-updates
num = StringVar()
ttk.Label(root, textvariable=num).grid(column=0, row=0, sticky='we')# label that we'll manually update via the scale's command callback
manual = ttk.Label(root)
manual.grid(column=0, row=1, sticky='we')def update_lbl(val):manual['text'] = "Scale at " + valscale = ttk.Scale(root, orient='horizontal', length=200, from_=1.0, to=100.0, variable=num, command=update_lbl)
scale.grid(column=0, row=2, sticky='we')
scale.set(20)
widget - Progressbar

进度条

p = ttk.Progressbar(parent, orient=HORIZONTAL, length=200, mode='determinate')  # indeterminate# determinate 确定进度
p.maximum
p.value# indeterminate 不确定的进度
p.start
p.stop
widget - Spinbox

带有编辑功能的选择框

spinval = StringVar()
s = ttk.Spinbox(parent, from_=1.0, to=100.0, textvariable=spinval, command=xxx)# 也可以参考combox的用法,在一个list中选择
values, from# event
Increment/Decrement
Layout
  • pack 最早期的方式,调整改动麻烦
  • grid 可以完全替代pack, 动态布局
  • place

一般的application都推荐使用grid布局。

  • columnspan/rowspan 跨多个单元格的占用。
  • sticky 控制cell内部widget的填充方式,默认是居中。
  • weight 控制多余空间grow权重。默认0 不改变。
  • columnconfigure/rowconfigure 可以配置weight.
  • padding/padx/pady 控制间距
from tkinter import *
from tkinter import ttkroot = Tk()# 主frame
content = ttk.Frame(root, padding=(3,3,12,12))
content.grid(column=0, row=0, sticky=(N, S, E, W))# 占用 0,0 的2行3列
frame = ttk.Frame(content, borderwidth=5, relief="ridge", width=200, height=100)
frame.grid(column=0, row=0, columnspan=3, rowspan=2, sticky=(N, S, E, W))# 从第三列开始,占用2列
namelbl = ttk.Label(content, text="Name")
namelbl.grid(column=3, row=0, columnspan=2, sticky=(N, W), padx=5)
name = ttk.Entry(content)
name.grid(column=3, row=1, columnspan=2, sticky=(N, W), padx=5, pady=5)# 第4行,每一列一个
onevar = BooleanVar(value=True)
twovar = BooleanVar(value=False)
threevar = BooleanVar(value=True)one = ttk.Checkbutton(content, text="One", variable=onevar, onvalue=True)
two = ttk.Checkbutton(content, text="Two", variable=twovar, onvalue=True)
three = ttk.Checkbutton(content, text="Three", variable=threevar, onvalue=True)one.grid(column=0, row=3)
two.grid(column=1, row=3)
three.grid(column=2, row=3)# 第4行,c3
ok = ttk.Button(content, text="Okay")
ok.grid(column=3, row=3)# 第4行,c4
cancel = ttk.Button(content, text="Cancel")
cancel.grid(column=4, row=3)# 注意,没有row=2, 所以row=2占用高度为0# resize时,自动grow的设定
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)content.columnconfigure(0, weight=3)
content.columnconfigure(1, weight=3)
content.columnconfigure(2, weight=3)
content.columnconfigure(3, weight=1)
content.columnconfigure(4, weight=1)
content.rowconfigure(1, weight=1)root.mainloop()

如果想要运行过程中,query/modify grid的属性:

# list the widgets
content.grid_slaves()for w in content.grid_slaves(row=3): print(w)# get info for grid
namelbl.grid_info()# modify it
namelbl.grid_configure(sticky=(E,W))# delete 
forget  # lost grid options
remove  # keep options when add it again
Widget - Menus
from tkinter import *
from tkinter import ttk, messageboxroot = Tk()
# 关闭默认的虚线,它会弹出菜单
root.option_add('*tearOff', FALSE)# Menu
m = Menu(root)   # root Menubar
m_edit = Menu(m) # 最外面一层的UI的Menu
m.add_cascade(menu=m_edit, label="Edit")  # 添加到menubar menu中
m_edit.add_command(label="Paste", command=lambda: root.focus_get().event_generate("<<Paste>>")) # Edit的弹出选择子command
m_edit.add_command(label="Find Some thing", command=lambda: root.event_generate("<<OpenFindDialog>>"), underline=6)root['menu'] = m  # 设置GUI上的 menu def launchFindDialog(*args):messagebox.showinfo(message="I hope you find what you're looking for!")root.bind("<<OpenFindDialog>>", launchFindDialog)# 多级menu
m_multi = Menu(m);
m.add_cascade(label='Top2', menu=m_multi);  # membar 上新增 Top2
m_multi.add_command(label='Top2-1')  # Top2 的子菜单 Top2-1
m_multi.add_command(label='Top2-2')
m_multi.add_separator()# check menu
check = StringVar(value='1')
m_multi.add_checkbutton(label='Check', variable=check, onvalue=1, offvalue=0)m_multi.add_separator()
# radio menu
radio = StringVar(value='2')
m_multi.add_radiobutton(label='One', variable=radio, value=1)
m_multi.add_radiobutton(label='Two', variable=radio, value=2)m_multi.add_separator()# submenu
m_multi2 = Menu(m_multi);
for i in range(10): m_multi2.add_command(label='Top2-3_'+str(i))m_multi.add_cascade(label='Top2-3', menu=m_multi2);  # 添加 menu 到 Top2-3子菜单下# 用来测试的 Entry
ent = ttk.Entry(root)
ent.grid()
ent.focus()# state
print( m_multi.entrycget(0, 'label')) # get label of top entry in menu
m_multi.entryconfigure('Top2-2', state=DISABLED)
m_multi.entryconfigure(3, label="change label")
m_edit.entryconfigure('Paste', accelerator='Command+V')# conetextual menus  右键菜单
rclickm = Menu(root)
rclickm.add_command(label="Copy")
rclickm.add_command(label="Past")if root.tk.call('tk', 'windowingsystem') == 'aqua':pass
else:# win32# 只绑定 Entry 控件ent.bind('<3>', lambda e: rclickm.post(e.x_root, e.y_root));root.mainloop()
Image
imgobj = PhotoImage(file='myimage.gif')
label['image'] = imgobjfrom PIL import ImageTk, Image
myimg = ImageTk.PhotoImage(Image.open('myimage.png'))
Canvas
canvas = Canvas(parent, width=500, height=400, background='gray75')
# 线
canvas.create_line(10, 10, 200, 50, fill='red', width=3)
canvas.create_line(10, 10, 200, 50, 90, 150, 50, 80)
canvas.itemconfigure(id, fill='blue', width=2)
# 矩形
canvas.create_rectangle(10, 10, 200, 50, fill='red', outline='blue')
# 椭圆
canvas.create_oval(10, 10, 200, 150, fill='red', outline='blue')
# 多边形
canvas.create_polygon(10, 10, 200, 50, 90, 150, 50, 80, 120, 55, fill='red', outline='blue')
# 饼、弧形
canvas.create_arc(10, 10, 200, 150, fill='yellow', outline='black', start=45, extent=135, width=5)
# Image
myimg = PhotoImage(file='pretty.png')
canvas.create_image(10, 10, image=myimg, anchor='nw')
# Text
canvas.create_text(100, 100, text='A wonderful story', anchor='nw', font='TkMenuFont', fill='red')
# Widget
b = ttk.Button(canvas, text='Implode!')
canvas.create_window(10, 10, anchor='nw', window=b)# event bindings
canvas.tag_bind(id, '<1>', ...)# tags
c.addtag('rectangle', 'withtag', 2)
c.addtag('polygon', 'withtag', 'rectangle')
c.dtag(2, 'polygon')
c.gettags(2)
c.find_withtag('drawing')# scroll
h = ttk.Scrollbar(root, orient=HORIZONTAL)
v = ttk.Scrollbar(root, orient=VERTICAL)
canvas = Canvas(root, scrollregion=(0, 0, 1000, 1000), yscrollcommand=v.set, xscrollcommand=h.set)
h['command'] = canvas.xview
v['command'] = canvas.yview
widget - TreeView
tree = ttk.Treeview(parent)
tree = ttk.Treeview(root, columns=('size', 'modified'))
tree['columns'] = ('size', 'modified', 'owner')
tree.column('size', width=100, anchor='center')
tree.heading('size', text='Size')# Inserted at the root, program chooses id:
tree.insert('', 'end', 'widgets', text='Widget Tour')# Same thing, but inserted as first child:
tree.insert('', 0, 'gallery', text='Applications')# Treeview chooses the id:
id = tree.insert('', 'end', text='Tutorial')# Inserted underneath an existing node:
tree.insert('widgets', 'end', text='Canvas')
tree.insert(id, 'end', text='Tree')# move widgets under gallery
tree.move('widgets', 'gallery', 'end')  tree.detach('widgets')
tree.delete('widgets')tree.item('widgets', open=TRUE)
isopen = tree.item('widgets', 'open')
其他
s = ttk.Separator(parent, orient=HORIZONTAL)
lf = ttk.Labelframe(parent, text='Label') # 也叫 groupbox # stack window layout
p = ttk.Panedwindow(parent, orient=VERTICAL)
f1 = ttk.Labelframe(p, text='Pane1', width=100, height=100)
p.add(f1)# notebook, tabs
n = ttk.Notebook(parent)
f1 = ttk.Frame(n)   # first page, which would get widgets gridded into it
f2 = ttk.Frame(n)   # second page
n.add(f1, text='One')
n.add(f2, text='Two')

Window

window = Toplevel(parent)  # create new top window
window.destroy()  # 销毁oldtitle = window.title()
window.title('New title')window.geometry('300x200-5+40')
window.minsize(200,100)
window.maxsize(500,500)
window.resizable(FALSE,FALSE)window.update_idletasks()  # 强制刷新,获取最新的size
print(window.geometry())window.attributes("-alpha", 0.5) # 窗口透明度0-1
window.attributes("-fullscreen", 1) # 全屏幕
window.attributes("-topmost", 1) # top windowthestate = window.state()
window.state('normal')
window.iconify()
window.deiconify()
window.withdraw()window.protocol("WM_DELETE_WINDOW", callback)  # 拦截关闭消息
print("width=", str(root.winfo_screenwidth()) + " height=", str(root.winfo_screenheight()))

对话框窗口:

from tkinter import filedialog
filename = filedialog.askopenfilename()
filename = filedialog.asksaveasfilename()
dirname = filedialog.askdirectory()from tkinter import colorchooser
colorchooser.askcolor(initialcolor='#ff0000')from tkinter import messagebox
messagebox.showinfo(message='Have a good day')
messagebox.askyesno(message='Are you sure you want to install SuperVirus?'icon='question' title='Install')

自定义对话框:

ttk.Entry(root).grid()   # something to interact with
def dismiss ():dlg.grab_release()dlg.destroy()dlg = Toplevel(root)
ttk.Button(dlg, text="Done", command=dismiss).grid()
dlg.protocol("WM_DELETE_WINDOW", dismiss) # intercept close button
dlg.transient(root)   # dialog window is related to main
dlg.wait_visibility() # can't grab until window appears, so we wait
dlg.grab_set()        # ensure all input goes to our window
dlg.wait_window()     # block until window is destroyed

fonts

from tkinter import font
font.names()
# ('fixed', 'oemfixed', 'TkDefaultFont', 'TkMenuFont', 'ansifixed', 'systemfixed', 'TkHeadingFont', 
# 'device', 'TkTooltipFont', 'defaultgui', 'TkTextFont', 'ansi', 'TkCaptionFont', 'system', 'TkSmallCaptionFont', 'TkFixedFont', 'TkIconFont')f = font.nametofont('TkTextFont')
f.actual()  # {'family': '.AppleSystemUIFont', 'size': 13, 'weight': 'normal', 'slant': 'roman', 'underline': 0, 'overstrike': 0}
f.metrics() # {'ascent': 13, 'descent': 3, 'linespace': 16, 'fixed': 0}
f.measure('The quick brown fox')# set font for label
highlightFont = font.Font(family='Helvetica', name='appHighlightFont', size=12, weight='bold')
ttk.Label(root, text='Attention!', font=highlightFont).grid()

Theme

和CSS不同,效果类似。相对比较复杂。

>>> s = ttk.Style()
>>> s.theme_names()
('aqua', 'step', 'clam', 'alt', 'default', 'classic')>>> s.theme_use()
'aqua's.theme_use('themename')# 第三方主题  awthemes-*.zip.tcli
# https://wiki.tcl-lang.org/page/List+of+ttk+Themes
root.tk.call('lappend', 'auto_path', '/full/path/to/awthemes-9.3.1')
root.tk.call('package', 'require', 'awdark')
root.tk.call('source', '/full/path/to/themefile.tcl')# 定制
s.configure('Emergency.TButton', font='helvetica 24', foreground='red', padding=10)
s.map('TButton', background=[('disabled','#d9d9d9'), ('active','#ececec')],foreground=[('disabled','#a3a3a3')],relief=[('pressed', '!disabled', 'sunken')])s.lookup('TButton', 'font')
s.element_options('Button.label')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/10978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java代码审计】敏感信息泄漏篇

【Java代码审计】敏感信息泄漏篇 敏感信息泄露概述 敏感信息泄露概述 敏感信息是业务系统中对保密性要求较高的数据&#xff0c;通常包括系统敏感信息以及应用敏感信息 系统敏感信息指的是业务系统本身的基础环境信息&#xff0c;例如系统信息、中间件版本、代码信息&#xff…

回归预测 | Matlab实现GA-LSSVM遗传算法优化最小二乘支持向量机多输入单输出回归预测

回归预测 | Matlab实现GA-LSSVM遗传算法优化最小二乘支持向量机多输入单输出回归预测 目录 回归预测 | Matlab实现GA-LSSVM遗传算法优化最小二乘支持向量机多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现GA-LSSVM遗传算法优化最小…

Linux进程控制——Linux进程终止

前言&#xff1a;前面了解完前面的Linux进程基础概念后&#xff0c;我们算是解决了Linux进程中的一大麻烦&#xff0c;现在我们准备更深入的了解Linux进程——Linux进程控制&#xff01; 我们主要介绍的Linux进程控制内容包括&#xff1a;进程终止&#xff0c;进程等待与替换&a…

车载测试:为什么你投十份简历,只有一两家公司约你?

最根本的原因&#xff0c;就是一方在汲汲渴求&#xff0c;而恰恰另一方呈现出的关键点让其怦然心动。求者心中有所想&#xff0c;而应者恰恰展现了求者所想的那一面。这就是个中奥妙。 程序员在找工作时&#xff0c;在一开始有三件事情会对能否获得面试机会至关重要&#xff1…

计算机毕业设计springboot+vue高校教师职称评审评定系统605z3

技术栈 前端&#xff1a;vue.jsElementUI 开发工具&#xff1a;IDEA 或者eclipse都支持 编程语言: java 框架&#xff1a; ssm/springboot 数据库: mysql 版本不限 数据库工具&#xff1a;Navicat/SQLyog都可以 详细技术&#xff1a;javaspringbootvueMYSQLMAVEN 本系统采用in…

MySQL相关文件的介绍

其中的pid-file/var/run/mysqld/mysqld.pid是用来定义MySQL的进程ID的信息的&#xff0c; 这个ID是操作系统分配给MySQL服务进程的唯一标识&#xff0c;使得系统管理员可以轻松识别和管理该进程。 其中的log-error/var/log/mysqld.log是MySQL的错误日志文件&#xff0c;如果有…

leetcode 797.所有可能的路径

思路&#xff1a;dfs。 其实很简单&#xff0c;我们只需要和昨天做的题一样&#xff0c;直接遍历所给数组中的元素&#xff0c;因为这里的数组意义已经很清楚了&#xff0c;就是当前位置的结点和哪一个顶点有联系。 注意&#xff1a;在存储路径的时候&#xff0c;我们需要按顺…

绘制loss和acc图

绘制损失图&#xff1a;导入loss的npz文件 import numpy as np import os import matplotlib.pyplot as plt# 读取npz文件 folder_path r"C:\Users\Administrator\Desktop\Breast\MR_loss" data np.load(os.path.join(folder_path, loss.npz))# 获取my_train_loss…

Matlab-粒子群优化算法实现

文章目录 一、粒子群优化算法二、相关概念和流程图三、例题实现结果 一、粒子群优化算法 粒子群优化算法起源于鸟类觅食的经验&#xff0c;也就是一群鸟在一个大空间内随机寻找食物&#xff0c;目标是找到食物最多的地方。以下是几个条件: (1) 所有的鸟都会共享自己的位置以及…

2024中国(重庆)无人机展览会8月在重庆举办

2024中国(重庆)无人机展览会8月在重庆举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 报名&#xff1a;【交易会I 59交易会2351交易会9466】 展会背景&#xff1a; 为更好的培养航空航天产业和无人…

多用户商城系统哪个好,2024年国内五大多用户商城系统盘点

2024年国内五大多用户商城系统中&#xff0c;每个系统都有其特点和优势&#xff0c;选择适合自己需求的系统需要综合考虑各方面因素。以下是对这五个系统的简要盘点&#xff1a; 商淘云 优势&#xff1a;商淘云是一套成熟的电商解决方案&#xff0c;具有丰富的功能和稳定的性能…

Python中设置数值输出精度的方法详解

这里写目录标题 Python中设置数值输出精度的方法详解字符串格式化方法1. 使用字符串格式化操作符 %2. 使用str.format()方法3. 使用f-string&#xff08;格式化字符串字面量&#xff09; 设置全局精度使用 decimal 模块 总结 Python中设置数值输出精度的方法详解 在Python编程…

【linux学习】多线程(1)

文章目录 线程的概念线程与进程 线程的用法线程的创建多线程 线程的等待线程锁死锁 线程的概念 在Linux中&#xff0c;线程&#xff08;Thread&#xff09;是程序执行流的最小单位&#xff0c;是进程中的一个实体&#xff0c;负责在程序中执行代码。线程本身不拥有系统资源&…

支持视频切片的开源物联网平台

软件介绍 MzMedia开源视频联动物联网平台是一个简单易用的系统,该平台支持主流短视频平台&#xff08;如抖音、快手、视频号&#xff09;的推流直播功能&#xff0c;同时提供视频切片等功能。系统后端采用Spring Boot&#xff0c;前端采用Vue3和Element Plus&#xff0c;消息服…

计算机毕业设计python校园二手交易系统aqj3i-

什么叫三层架构呢&#xff1f;指的是表示层、组件层、数据访问层。组件层是双层架构没有的&#xff0c;它的加入&#xff0c;把复杂的问题分解得更简单、明了&#xff0c;通过组件层&#xff0c;实现控制数据访问层&#xff0c;这样达到功能模块易于管理、易于访问等目的&#…

基于select for update 实现数据库排他锁

1、select for update 的基本语法 SELECT * FROM table_name WHERE condition FOR UPDATE;2、select for update 的定义及作用 2.1 、select for update的含义是在查询数据的同时对所选的数据行进行锁定&#xff0c;以保证数据的一致性和并发控制。在并发环境下&#xff0c;多…

<MySQL> 数据库基础

目录 一、数据库概念 &#xff08;一&#xff09;什么是数据库 &#xff08;二&#xff09;数据库存储介质 &#xff08;三&#xff09;常见数据库 二、数据库基本操作 &#xff08;一&#xff09;连接数据库 &#xff08;二&#xff09;使用数据库 &#xff08;三&…

Element-UI el-select下拉框自定义过滤选项全选

文章目录 前言一、思路讲解二、完整代码示例前言 Element-UI el-select下拉框多选实现全选 在这篇文章介绍了添加 el-option、el-checkbox 两种方式实现下拉框多选实现全选。 本文将介绍添加 el-button 的方式实现下拉框自定义过滤选项全选,当然也可以添加 el-option、el-ch…

如何安全可控地进行内外网跨网络传输文件?

跨网络传输文件通常指的是在不同的网络环境之间移动数据&#xff0c;这在现代企业运营中非常常见。随着网络技术的高速发展&#xff0c;为了有效地保护内部的核心数据资产&#xff0c;企业一般会采用内外网隔离的策略。在进行内外网跨网络传输文件时&#xff0c;需要考虑多种因…

Leetcode 3144. Minimum Substring Partition of Equal Character Frequency

Leetcode 3144. Minimum Substring Partition of Equal Character Frequency 1. 解题思路2. 代码实现 题目链接&#xff1a;3144. Minimum Substring Partition of Equal Character Frequency 1. 解题思路 这一题的话思路上还是比较直接的&#xff0c;就是一个动态规划&…