Tcl/tk实例-工具栏和菜单-图片预览工具

2023-05-16

可以打开并查看图片,点击工具栏上 Previous 和 Next 按钮来浏览 前/下 一张。仅仅是一个例子,其它按钮和菜单未添加命令。

package require Ttk
package require Img
package require base64
package require BWidget
package require Thread
package require Ttrace

set icon(import) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
	bWFnZVJlYWR5ccllPAAAAg1JREFUeNp8U0FME0EUfTM7s9AWkhKTpcSrePBkCB4gYAwHPXCQyEEk
	wQs3z57VaEKIiVdveCEpBGoLBBBOYLh4NASORNGDaThQFNva7u74Z3bbbrXwmt/+nZn/+v6ft0wp
	BY219fVT1/OSyvcRrGjojIEzBsbYyYOxMQcRmFr9peN9LqcuQz6fV5lsNv0vAW9iI3z5ekzxLYxj
	szafTsNxHAwNDDzK5HILURIeFashhICUQejcHKIWqq6L7lQKw4ODE9mVlUytTkT0hASW7tfkvvLN
	7/XeXiwtL9OzwtTkpFY7/j9BCIs3CCz6FIsl3OrvN1E/wyxcSMAtAV2viWxh0wGJatGv78s4R0J2
	XEwgBDcK2mUMs6uvsPl5g26S11vknCNmt2N05t4iPU60bIFTQZuUpnjm8RQqbgWe75EjGIQlEW8j
	8szaw9YElmVIAm0c5+UC7ve9aDrzYX8W4Xwb19gg4CYCMJyV8/W9ub0nmH6XxO/KKRAOuqGgtkDS
	dQtBOcN59Sww06enmB5+i2QihZ9/vpu9JgV6OMEMeI3LtOOyksn3f2xj4+ANxvueoeQVDH2TAnLb
	L3JYpzaLdl5cJGiQNpjw8Xr3Lpyuqzg82cbhzhaudPaQFwJiVnsH6OpuGu9EMPL89mLc7rgGxcJ/
	VMbynFK37H7cfLl1J0qAFrhBEUNrFKj26K8AAwCgT9EiWWDEHQAAAABJRU5ErkJggg==
}

set icon(export) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
	bWFnZVJlYWR5ccllPAAAAgVJREFUeNp8k0tPE1EUx//3MSMtEF1VPgC4MCxc4AJijdGoCzdEFmIT
	MfET4M6diSbatWHtxqQ0trZIkJi4MOzcwRcgUhcmjQlteHQS5nE998xMmUrxPz1zH3PPb845cyqM
	MbBa39joBGF4yUQR4h0rOxOQQkAI8efh/HwBGbGvvVn71Gya/6ndbpt6o1H5FyAHaKSfey2yX4m1
	eO9DpYJCoYAbs7OP683mahYis8Faaa3hOLHZOR+iFPwgwOWJCRTn5hYba2v11E9n4kkAyubL88hE
	PF6ZmsLHWo3WBk9KJRvtwllAIiVPAYquXs/D9ZkZtv4ZoXAuQCoN629BrnbpgAO/F/WfO3mJUWfs
	fIDWkiMYcXIof36NzZ0vtJb8OeN6SIy4Lh68uV+l5eLQFOyhC47Dzm+XlhBQb1A3MMiYkAHl2voj
	C5BnAErF1aefoFx7J4e4N/0cvzu7eL+1jLvTyzjw9rmgw4uoJEURc6n/cHSyj+qPF3hafIcQcS26
	Xruf0ikgqbym0KVIADQeBwfY3vvGzs+KK7x/5HcYPgCQyVvTt6cF88IuVkqtgSh9HCeFzQKEOKQO
	G7e52c7L61G4FI1RPsrf7yAMA+pWw0Uez12kMY5ApP8B+nTXuHcyuv3yZjXvjk0aI9g5rYsk58Dz
	tzZffb2VBWCIrpLlMFxd8t39K8AAxyfX6zUxRPMAAAAASUVORK5CYII=
}

set icon(open) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
	bWFnZVJlYWR5ccllPAAAAaFJREFUeNqkU88vA0EU/mZ2WiElfobERfwBLiIhcfA/OLkicXSU4OJQ
	cSc9ceQiEkcu4ibiUhWkxKb1o6qyqVLbre7OerMqWqlkpS/59n2T9743M2/2Mdd1UY+JkxVWM8AZ
	BsiN1wjtSBex730FYYrQ9zuLkjA4JxdzhQKypolpvQOGYWL9NMQpPETYUHnsKIzw8OzuPBwHrivh
	yko4X17FypwxhujmzDJpF7wTOBKaEsuPYpVQVog9XvaaFoCnIQvQl6tF9c5/i79PojRB4fUJwqaF
	tG0Y8UMU354BVYw69AVJa/Lyh3PO1c6jpF2iQyQEFRVWLg2bknpGJnw9Xe/Y5PB7Ru++2J5fFTZd
	K288QGtqg5VJw89/wRjHc/z43rJxrgqIbEpHV/8gbGqkH9OCDUjfnKVNC5eiJCHyuVf0sIDvAk7J
	eksl9SeN415Q/wJaYztsy6ROS18FjFT8MVfANVFXEGkJNXfSk3Bwjfu4P8OdfvVydovY2h49YzSB
	5OtW5OA/A6RncB3Zh060VU1SUJHyXPg1h2ARiqzecf4UYAAOUhKfHcZJBAAAAABJRU5ErkJggg==
}

set icon(settings) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAANkE3LLaAgAAAs1JREFU
	eJx9U11Ik2EYPTp1ueXU5dLpMvMnsEjnJq7yB5WyMEgIlTQVRU1YA/MiVpgEilPvugjUK2mKdhFN
	Niy0lQOxtilp7sJkKeq+YWvCN/Sz+bP2dpNh/p3L85xznsMDDwBAIpHkRkdHX8DRCKipqbmv1+vH
	NBrNRwDB/01LSko6JiYmfmVlZV05zN3Z2dlLCCEURf3OzMxU/KX9AZzY1bBbW1t14+PjVgC8vea0
	tLQcmqaJ2+0m1dXV7bt8V1fXy6Kiogd7tb6FhYUvVCrVWwABu2R+fn4lTdPE4XAQk8m0KJVKZUql
	stnj8ZC8vLzaA3UrKip6GhsbNQBYABATEyObn58nNpuNrKysEIqitmmaJmaz2R0SEpLkuz9ArVbX
	0jRN6uvrewAENDQ0yLlcLgDA6/WCzWb72+12tLS0dLtcrhmfw44GwK+urq6/oKAgQya7LGTWXFCp
	2nTLFLUYFhYmNBqNI1arVQ1gy++IAHZKcgo3NjZOSK/+wLuxyYXuvj453G5qv5C1n+DxePzBwUHt
	paSk69ubGzDZdvCZnRoqPHuO/31Mpz02QCDgRKjVAzpxcko6L+gkDIZR+6Nei3PdL5wfJ04Vh0dG
	nl4wDg8d2lkoFEaPDI9MLy0tE6fTSSwWy6ZIFHETQCInt8kmaZ4k5W9+kozapva9PhYAiESieK1W
	+z4+ISERIPB6vSgtLX04Ozs3AGB1x/bFvOYbcdsbKOAkXL2WEciGxz7zaQwAWDwej6/RaPT9/a+m
	GGZtXSwWn6mqquoYHR1t+7fGu23bsU9/XWOJChB4in0+PS/XZ8tFO+amTFAoFI83NjaIQqF4ZjAY
	vsnl8teHHRcAECi4w7313C1tNpPyQZok5BbfRVlZ2ROGYQjDMESpVA5h3y8cACeqIrhYTVKfflgP
	jbl4AwCCsrOz5RKJpBIA91jzLkLi77G4UTkA8AemGSncz8QQ2gAAAABJRU5ErkJggg==
}

set icon(help) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAABl0RVh0
	U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAM2SURBVDiNbZNbbFRlFIW/8//nWlEawIZO
	ofQ27YBOqVOCBU1TLkYt+qKihsSEmBgTKwZJTCdBjGmirRck8UENiRHS+OCDCaBHI4KO1aAFaRla
	24Jjp2KdoS1Qe5lpp3bO70NLA8Gd7JedvVfWXllLU0pxYxVvawkAzwB1QHB+3AVEgNa4G+67cV+7
	DlC8rUUAjYtyzFd3PrrOvifgE5Xl+QCcv5ik80LCO3Ts18xkeqYJeDvuhr0FgPnjtvuqikItLz3s
	nIoOcKI9Rk//MABrSvJ4oMbPxrWrCL//9dRPnQMdQG3cDXv6PJPGTetKQ2/uesjZs/9Lro2l2fvc
	Zir9+aSnZvihI06r28nxX2K8u+cR55UDbvWPHfFGoJmi+uZAcPt7qb+Hx9TT4U9VUX2zerHliMpm
	PdXTP6RGx9NKKaVOno6pmp0fqYa3vlCJkXEV3L4/XVTfHJC5/q0vv/Dkhk2j42nt0LGzABiGzmfH
	z3PYPUd79188vuVuVi7P5fPvexkZTVG6YgklK5bKU9E/JwRQV1Xh0060xwCwTJ1Ll8dIXk1hWwZV
	FT4Arv6TxjB0chyLzt+HCK0uEFKIOh0IBsuWE72YxDAkpmlgWQaWaRAKFLB7x0aUUhw82oFjWwih
	kbgyyeriPDylgtdFRAgNQ9cxjbm2TIO9z9Zi6pLDX0XpuzRKjmMihMCxTDQ0NEAAXV2xy4QCBRiG
	nGNh6Cy+3WYgOcaZ3gRt0UEc28SxLXIck/LCZcQGryGk6BJA5NyFhLdlfRm6LtF1iWHoaELwc/cg
	p3uTSCmxbWMBpNKfR/cfQ14260UE0PrxkTOZDWtXsf6ulehSoktB7iKH3U/dS8Nj1eQ4JpZlYtsm
	a4rvpMyXy4HWSEYp1SribrhvIpVp2vfBN1OvP7+ZUMCHlAIptQW/G/O6BAqX8ERtKa99+O30RCrT
	FHfDfTdZeWuNv/qNhgftaGyYaGyYxJVJbHvu58rSZZTkL6bp4Mlpt63n7My/s7VxN+zdEqY7brP3
	7dpxv11V4dPKC5eiaRrxxCi/9Y9473zyXWZ8crop63k3h+n/4iylqFNKBQGklF2zs9mIUuqWOP8H
	ZvdMlKLbimEAAAAASUVORK5CYII=
}

set icon(about) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADYUlEQVR4nGJkQALKAZOZGBgZLQV5
	OCKE+DmtebnYpP79+8/w8cvPZ+8//zj66duPFQz/GY/f3ZDzD6YHAAAA//9ihDFUAqeICvNx1qsp
	CCdLCHJzMLMwMfz9+5/hz99/DH/+/mX49uMPw+v3X388fvlp7pdvvxpvr895zcDAwAAAAAD//wBB
	AL7/AQAAAAAfTpEXIBgQnDEnGEwJCAQA+vv+AC4eBgAsHwwAAAAAANDe8gDH2fQAAP8BAPX3+QDd
	5e+06/D3ZN+xbekAAAD//wBBAL7/AR1LkAMWEguPOS0cbQkGBAD5/P0A//8AAG9RJAAPDw8AAAAA
	APHx8QCEpdUA/P3+AP//AAD4+PwA2uPtk/P1+nEAAAD//wTBuQ2AMBAEwD0fEBBtQERGF67I/SI5
	R/QASKB7mCnTqHVb2VQF92swT3gE+vmAJEhiPy54JNwTnzmKChbObVCpPwAAAP//RNDRCYAgFIbR
	T0iuldF47hmuEDSGW0Sg9/exM8JZjs3Kmc3er/+bgvo0rrvhApeQBAGCoA9nX6OlFMsEAAD//zzQ
	UQ2AUAhA0esmfshMYJUXwSZWsIyhzMIYAv55Ipx5W5cBExH1r57HjqoiIgCYGdf94J54JPEmWUV3
	jw8AAP//YuFgZ5X6/fcvw/9/DAxMTJBI6V3/iGFivg0DCwsLAwMDA8OXL18Ybtx/C9XEAHENAwMD
	IyOjFAAAAP//Yvn77x/Dv38MDL///GP49u0nw7vPPxg+fPnJwMHBwcDDwwP31e8/f5FinpGBEZoA
	AAAAAP//Yvn67deztx++ib9895Xh05efDH/+/WNgYmRk+PMHKUwgtjFgAc8AAAAA//9i+fDlx5F3
	n38Y/v7zl4GZiYmBhZkJm0Jc4AgAAAD//2L68/f/yr///v1kYWZiwG4JTvCTgYFhJQAAAP//YmJk
	ZDjBxMg4C1lmc5szPAAZGBgYWFhYGDa3OaMbMIuBgeEEAAAA//9iZGBgYFAJnCLOwMAwh4GBwYdI
	27cwMDCk3Fmf8xIAAAD//2JiYGBguLM+5yUDA0MSAwPDVAYGhh94NP6AqkmC6mEAAAAA//9C8bVK
	4BQmBgYGSwYGhggGBgZrBgYGKajUMwYGhqMMDAwrGBgYjt9Zj8jOAAAAAP//AwBqPBucJP8EOQAA
	AABJRU5ErkJggg==
}

set icon(detail) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0
	U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHSSURBVDjLpZPbSxtREMbzL4pSpYj1VilU
	mmpQSCKCSLAgihFTo9Eg0TRZY5LdxJgbKYo+2AstLRbU1nfxrlmTdLPJ55nZ+OCjyYGPYQ8zv/PN
	7DkmAKZGZGoakN5OKSeqPfAPtk9Ca8ew+g4xvPIHQ94DWJZ/Y3DxJ94v/ID54zf0z32BbXFPpToG
	ODZOKrPpUzxX5pmdCgPo5HrUN7kNBtjW/qKe1TORMwDW1SPeeJ0ucMzlcshms0gmkyhqVSQSCVzm
	dSiKAlmWEQ6HOa/TkakBxMBolUQyFRRIpQruijp/3xR0XN/ruMiXcXar4fRG4/yOsaQBoGmzpa08
	x0wmg1QqhVgsxoBoNMoQSZIQCATg9/s5r300YQDoV9HS9Cr+l6vspFRzQgBVOCE3j06uVJ3zX47E
	DIBl6RdvdG9ec6Se4/E4QqEQA4LBIO5FSz6fD16vFx6Ph/PabLIBMM9/541ypYpyzQWpqD2VKiB5
	4YJEq2VowwC8m/tqTFU+50i9RyIR7pUK6WSKbrcbLpcLTqeT85ot6wagf3a/rnvQNCjh8S1Ib6Z3
	+Wb1fviMLkcWr8bTYsqbPKg2u4JWawQvhsPCdkicLEHUkCQGNPwaGwU8AG9RQVkc+5PeAAAAAElF
	TkSuQmCC
}

set icon(clear) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAABl0RVh0
	U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKXSURBVDiNlZJLaJRnFIaf75uZ6EwSm9tI
	QpNIvNWoFCsmiwrSgotKS3aCl4WL0Y2CIvwLBV0YFwYckFIQhI7GhWBLdaEL6Y0WMS20aTQxijGN
	mnFGSZPJZcw/80/+//uOK0VjIfisz/twzstRR75gczjEBRGixrL31A35kfdAhzTfr22Ordqworwx
	pLl6dJva+l4CYHFFVLO0KsLHLbFYSHP29H6lU0nVmUqq2gUFVugcfFJ0fSPU15QRXazqqxrpBY4D
	SxcUiPCN65mLtwbz7kzJp6mdypWtGzfE400vgLqFBEpEAOjap07EV3L8k7bPVXNLOz2nu73pf8Zy
	7FSTxsglEc4nHBn/X0EqqXZprb79dHNHtK6ugX+//punVx+y/ux2atdVkR7t9+7f/UOM9b4zRo4l
	HMnOF+zRmmRTfWs5lyRqJl22dG9lUY0GFYVQNX5Qzr3BX/2B/t8N4v9gDCng5usTUkm1KHKOOxXN
	tas6Lh8Oaf0cQg1gxsBksUEez7bgzdWQyQzI45EBd2oyW9SvVkk4UvJ301V7sLGkI2VgZyEYAZMF
	8x9e4RmzuevMjJ0jXo3a1P5VhVZKwm81UsHP2UxaW6tQ/ggiPv6ch1eapViYoVCYRkTQ4UrST3oD
	lPym38wnHHnmz02PpNN3mXFjTEyMksulmcxlcN0pRIRY9TYKRc3Qg/6SMThvCQACI4f6en8p+qzG
	dT2KxTzWBuhwDZXxHeTdmNy6eSVvTPBlwpHM6xLfpPuM6ln9UXvb8hWtES//J2WxNejIMh4N9wRD
	Q33j1vJZwpGHAOF30oAxdAw9+Ot25ZKGDz+oatOjo/f84eGfAmu869ZyIOHIxDufOJ9UUi1Tij6l
	EOCatZxMOPJ4/txLfgdDCCiEEtoAAAAASUVORK5CYII=
}

set icon(exportLog) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
	bWFnZVJlYWR5ccllPAAAAhZJREFUeNqMU81LG1EQn/e12QUJNQfpCj0EhB6CrSI9JNeK5BAN4kHE
	e/8FwRZ6KFgoUnpoQRCEgl5KL4IHUTwUqof2ViiFkoo5KGvIVk2z2Ww+djsT4roVTB0YmHnvzW9m
	3m+G5RYWgIRzDppSaTSH4ZYSBMGWjDjpJ5OTi4/HxnJo9wyseZ79bHX19ZFlKdlsNC7Ph9Ojo7nf
	jtMzWIvF4P329tbPYvGDVKoo3Xo9vKygXf0PQB9j8HF390AIUWi12yBrtVp42fJ9aOJhL6E30Zh/
	ADiik94kvw4PwcEKsW3B0W9g+5wALpURALJxk5bLZZidmACNsT4B8ChoNrEC1w0zCASQnIc+/U+l
	UoGybcPZ+TnU0T8pleDLxsarVD6/iGxx6UYAJAIoIULfiMfB7O+Hh0NDoCsFIgL+fXNzKTk+/lx6
	nndVAT6IAhAjR5j9xLLgFDP/qVZhfmoK7pkm3M1kXmDLe9E5YFS+FgFIYAWk95PJjv92ba0TfGdk
	5CUG78QMY18GVwBSXGvhupgDA/B0eRmqrmsrKT+3cGIl0ODoemfIHGTCR56JypCRLrUM7fnpaZBS
	wtLKit+mebm4QAD6RF1P5bPZzLdCoVMBLhXESDUN9K6ST+fdKdGBJvj4GBtPJFKpbPZNybbPMHvQ
	U5G3d+vrn5hpziBInIAYM4wHfHBw7tYr7Dg/fMv6SqtDRP0VYADYyf2IZe0cagAAAABJRU5ErkJg
	gg==
}

set icon(exit) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
	bWFnZVJlYWR5ccllPAAAAp5JREFUeNp0U1tIFFEY/mbWMkRBd3UXQxNzFSlWlMWE0i3LLKKEfMyg
	l6CMHTYfEguMqNCwh7Zm0oQgeughAkOMKLObZkFQVIRFdnETzJx1V3G3XWfn0jmDszhhh/nmv3z/
	95/hP3OY2NANLF/DTZzTc4v/ihXWShxrOM+aOAuBP9WRM07tv+L/caymaqAgD7+2zuNzn/bCVlnu
	e3KA8xsc8Xl7TZXOUUviboNL0RQVjw+18Hnbq5sLPKWIjfahZL+HNvQNHfTRTSy5NVXeonq3zjl3
	V1OumXDKjpuXOOauPcOZZs8edx9tgDT2cum7WKS6tuJz/ygsq1eheJcbix9fgGyp06kuD15fuYP4
	bLiAme+/hkeHT/C2vAzv+goHGAbJJmvKawFVQfz9cFKsacC3N78RmloQdl6/yDGhvm6dGDzSxtty
	072FLpupCTSYxR+CCE9HhfreC5xeosoqKOqudnAzUxFh/J2IREyGHCf4I0GOSbpPc1/eigj+igq0
	1tCl0JexZDBgbblISFHiqaZj1EiGsdohiwFluYZVSEBxj2vnHRVlXmdtJeRFsmPcDEVSUVK/BTll
	G3yk1m/oWJUc40DLGb+9wuUtqipF6PkD8smSqYnuxxYRfnofxZvLSJONPqLhqZbpsWYWplkzv29q
	rMXcyEMy9aWBEQSmE2DJRPMdKTDmyrAWZG3bg1e3BxGbmy9gAr1dGDjZ4bemW3x52YxeSMWTQRXh
	iCpQUVY6683PZpNNJmdVhBZUYV/nKY6lf+Le823HRVI8MaNClhRQG4xoAslzFNSfEAmXUBAQFYgL
	Wg/NU23yLjScbeVmo9rlsWmAWhqbONLkE+HECAQSHzM45ofQaTquvvaudY3nWn+udJ0J5ySc6Tr/
	FWAAWrOVmqP8y7MAAAAASUVORK5CYII=
}

set icon(save) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0
	U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAH+SURBVBgZBcE9i11VGAbQtc/sO0OCkqhg
	hEREAwpWAWUg8aMVf4KFaJEqQtAipTZWViKiCGOh2Ap2gmJhlSIWFsFOxUK0EsUM3pl79n4f12qH
	b3z3Fh7D83gC95GOJsDe0ixLk5Qq/+xv/Lw9Xd+78/HLX3Y8fXTr2nWapy4eCFKxG7Fby97SnDlY
	tMbxthyfzHO//nl85fNvfvnk8MbX5xa8IHx1518Vkrj54Q+qQms2vVmWZjdiu5ZR2rT01166/NCZ
	g/2PFjwSVMU6yjoC1oq+x6Y3VbHdlXWExPd379nf7Nmejv2Os6OC2O4KLK0RNn3RNCdr2Z5GJSpU
	4o+/TkhaJ30mEk5HwNuvX7Hpi76wzvjvtIwqVUSkyjqmpHS0mki8+9mPWmuWxqYvGkbFGCUAOH/+
	QevYI9GFSqmaHr5wkUYTAlGhqiRRiaqiNes6SOkwJwnQEqBRRRJEgkRLJGVdm6R0GLMQENE0Ekmk
	SkQSVVMqopyuIaUTs0J455VLAAAAAODW0U/GiKT0pTWziEj44PZ1AAAAcPPqkTmH3QiJrlEVDXDt
	0qsAAAAAapa5BqUnyaw0Am7//gUAAAB49tEXzTmtM5KkV/y2G/X4M5fPao03n/sUAAAAwIX7y5yB
	v9vhjW/fT/IkuSp5gJKElKRISYoUiSRIyD1tufs/IXxui20QsKIAAAAASUVORK5CYII=
}

set icon(next) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
	AAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHUSURB
	VDiNpZKxixpREMa/dVeMq62lYBNio0fAyspGUWzEJaAhXboUKVOmzV+QLlyKkDpglUJXLUISELGS
	q2xSHLgE5T13WZ87b9LEJQl7B5IPHjMM3/wY5o3BzPgfWUlFx3G+a62/EdGr0Wh0vA+QSioy81W1
	Wn0J4Gu32314MUBrjXq9jl6v9ziXyy07nc7TSydAEAQoFApwHCdfLBY/tlqtd81mM/uv1xgOhzda
	60dEBK01zrHf78M0zRi4Xq+xXC7XRPRkMpmsY8BgMAhrtVomnU7DMIy/3vmHmBnMjN1uh8ViEUop
	X0yn0/cAkGJmCCEghMDhcIDv+/B9P86llJBSQggBwzBQqVQe5PP560ajcQ0AltYaq9UKtm0jm80i
	k8kglUrFyyQiKKUQBAF830cYhiAiZuZbALCYGWEYwjRNmKYJZo4jEeF0OkEphePxiCiKwMw/mfnZ
	fD7/fJ7gxrbtqyiKsN/vwczQWqNUKoGIwMyIoghKKSil3N/Nt/ESk0653W6H5XI5o5SClBKe52ml
	1Gut9ZvZbKb/9CaeMjPDsix4noftdvuDiIau635J8t4J2Gw2EEJ8Yubnruvuknz3AVZCiA/j8fjt
	XY1nJe7gEv0Cn0ExX3uDYC0AAAAASUVORK5CYII=
}

set icon(previous) {
	iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
	AAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHTSURB
	VDiNpVO/q9pgFD33fpEQQnBwlnbppEOKU6mgkgiCKHTt3qHQsUPnFrq0c4f+AQpP3O3QYLooHR5d
	u0iLoMUOBhNinvnxdXhon6Au74M7nXvPd++555KUEvd5yiWw2+0qzPxOCNEaDoePT+XwueJ2u/0A
	wDfTNN9IKc1zeScJWq3WM03TfnQ6nSfVahVZlp3t8miEZrOpEtHHYrH4yrZt6LqOMAxxSSfag5Zl
	PWLmK9M0zXK5DCICEQEABoMBmBnMDCEEhBBg5t+9Xu8hSSnRaDSe67r+uVKp6IVC4XY2vp3uLpGU
	ElJKZFmGyWSCfr9PSq1W+2QYxstSqQQiwnq9Pvy2j7sEaZoiy7KDLgqAP0EQyOl0SqqqQtd1aJoG
	VVWhKMqh5X3xzc0NttvtQRd2XfetlLJJRH+TJEEYhvB9H0EQIAxDRFGEKIqw2+0QxzGSJEEcx/8J
	AMB13a8AygC+pGkKIgIzQ1EU5HI5LBYLLJdLrFYrbDabvQ4/j7YAAPV6nZj5tRDifT6fVwzDgKZp
	mM1mGI1GdGqNR0Yaj8fScZwPaZo+9Tzvl+/7IKKLPjjpRMdxvkspTc/zrubz+UWCw27PhWVZL2zb
	vj6H033P+R+JCADzIQVFMAAAAABJRU5ErkJggg==	
}

proc main { } {
	global lab icon
	set w .
	wm title $w "Example - Toolbar,Menu"
	set f [ frame $w.toolbar -relief ridge -borderwidth 1 ]
	pack $f -side top -anchor nw -fill x 

	set sw [ ScrolledWindow .sw  ]
	pack $sw -side top -anchor nw -fill both -expand 1
	set sf [ ScrollableFrame .sf -bg black ]
	$sw setwidget $sf
	set f2 [ $sf getframe ]

	foreach val [ array names icon ] {
		set $val [ image create photo -data $icon($val) ]
		ttk::button $f.$val -image [ subst $$val ] -compound center -style Toolbutton
	}

	foreach separator { sp1 sp2 sp3 sp4 } {
		ttk::separator $f.$separator -orient vertical
	}

	$f.open config -command "openFile"
	$f.previous config -command "previous"
	$f.next config -command "next"
	$f.about config -command "About"
	pack $f.open -side left -padx 2 
	pack $f.save -side left -padx 2
	pack $f.sp1 -side left -ipady 7 -padx 2
	pack $f.import -side left -padx 2
	pack $f.export -side left -padx 2
	pack $f.sp2 -side left -ipady 7 -padx 2
	pack $f.settings -side left -padx 2
	pack $f.sp3 -side left -ipady 7 -padx 2
	ttk::checkbutton $f.b5 -image $detail -compound center -style Toolbutton
	pack $f.b5 -side left -padx 2
	pack $f.exportLog -side left -padx 2
	pack $f.clear -side left -padx 2
	pack $f.sp4 -side left -ipady 7 -padx 2
	pack $f.help -side left -padx 2
	pack $f.about -side left -padx 2
	pack $f.previous -side left -padx 2
	pack $f.next -side left -padx 2

	set lab [ label $f2.lab1 -bd 0 -justify center -bg black ]
	pack $f2.lab1 -padx 2 -anchor nw

	menu .menubar -tearoff 0  
	. config -menu .menubar 
	foreach val { File View Settings About } {	
		set menu($val) [ menu .menubar.m$val -tearoff 0 ]
		.menubar add cascade -label $val -menu $menu($val) -underline 0 
	}
	$menu(File) add command -label "Open..." -command "openFile" -underline 0 -image $open -compound left -accelerator "Ctrl+O"
	$menu(File) add command -label "Save..."  -underline 0 -image $save -compound left -accelerator "Ctrl+S"
	$menu(File) add command -label "Import..."  -underline 0 -image $import -compound left -accelerator "Ctrl+I"
	$menu(File) add command -label "Export..."  -underline 0 -image $export -compound left -accelerator "Ctrl+E"
	$menu(File) add separator
	$menu(File) add command -label Exit -command exit -underline 1 -image $exit -compound left

	$menu(View) add check -label "Aways on Top"
	$menu(View) add cascade -label "Zoom" -menu $menu(View).zoom
	$menu(View) add command -label "Workwrap"
	$menu(View) add command -label "Back" -command "previous" -image $previous -compound left
	menu $menu(View).zoom -tearoff 0
	$menu(View).zoom add radio -label "Zoom Out" -underline 0
	$menu(View).zoom add radio -label "Zoom In" -underline 0

	$menu(Settings) add command -label "Preferences..." -underline 0 -image $settings -compound left -accelerator "Ctrl+P"

	$menu(About) add command -label Help -underline 0 -image $help -compound left
	$menu(About) add separator
	$menu(About) add command -label About -command "About" -underline 0 -image $about -compound left

	bind . <Control-o> "openFile"
	bind . <Key-Right> "next"
	bind . <Key-Left> "previous"	
	bind . <MouseWheel> {
		if { %D >= 0 } {
			previous
		} else {
			next
		}
	}
	focus -force $w
}

proc SelectNextImageFrame {w interval} {
	global animationCallbacks
	catch { set animationCallbacks [ after $interval SelectNextImageFrame $w $interval ]
	set image [ $w cget -image ]
	set idx -1
	scan [ $image cget -format ] "GIF -index %d" idx
	if {[catch {
		$image config -format "GIF -index [ incr idx ]"
	}]} then {
		$image config -format "GIF -index 0"
	}} result
}

proc animateLabelImage {w interval} {
	global animationCallbacks path
	catch { set animationCallbacks [ after $interval SelectNextImageFrame $w $interval ]} result
	trace variable path w ReadOnlyTrace
}

proc ReadOnlyTrace { varName index op } {
	global animationCallbacks
	catch {
		after cancel $animationCallbacks
		unset animationCallbacks
	 } result
}

proc openFile {{file ""}} {
	global lab path

	if { $file == "" } {
		set types {
			{{Image Files}       {*.jpg;*.gif;*.bmp;*.png;*.pcx;*.ico;*.tiff;*.raw;*.ppm}   }
		}
		set file [ tk_getOpenFile -parent . -title "Open image file" -filetypes $types ]
	}
	set path $file
	set err [ catch { set bd [ open $file { RDWR BINARY } ]} result ]
	if { $err != 0 } {
		return
	}
	set data [ read $bd nonewline ]
	close $bd
	set imageData [ base64::encode $data ]
	set image [ image create photo -data $imageData ]
	$lab config -image $image

	if {[ string tolower [ file extension $file ]] == ".gif" } {
		animateLabelImage $lab 100
	}
}

proc previous { } {
	global path
	if {![ info exists path ] || $path == "" } {
		return
	}
	set list [ glob [ file dir $path ]/{*.jpg,*.gif,*.bmp,*.png,*.pcx,*.ico,*.tiff,*.raw,*.ppm}]
	set pos [ lsearch $list $path ]
	if { $pos != 0 } {
		incr pos -1
	} else {
		set pos end
	}
	set path [ lindex $list $pos ]
	openFile $path
}

proc next { } {
	global path
	if {![ info exists path ] || $path == "" } {
		return
	}
	set list [ glob [ file dir $path ]/{*.jpg,*.gif,*.bmp,*.png,*.pcx,*.ico,*.tiff,*.raw,*.ppm}]
	set pos [ lsearch $list $path ]
	if { $pos != [ expr {[llength $list ] - 1}] } {
		incr pos 1
	} else {
		set pos 0
	}
	set path [ lindex $list $pos ]
	openFile $path
}

proc About { } {
	set msg " \n This is an example for toolbar and menu.\n\
				It also can preview image!\n\n\
				Tcl/tk application.\n\
				Author\t: Andy_Wen\n\
				Email\t: wn0112@gmail.com"
	tk_messageBox -type ok -title "About" -icon info -message $msg

}

proc popErr { str } {
	tk_messageBox -type ok -title "Error" -icon error -message "$str"
}

main

if { [ lindex $argv 0 ] != "" } {
	openFile [ lindex $argv 0 ]
}


 



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tcl/tk实例-工具栏和菜单-图片预览工具 的相关文章

  • C++中的迭代器和泛型算法

    简单的迭代器和算法 1 迭代器令算法不依赖于容器 xff0c 但算法依赖于元素类型的操作 泛型算法本身不会执行容器的操作 xff0c 它们只会运行于迭代器之上 xff0c 执行迭代器的操作 算法永远不会改变底层容器的大小 算法可能改变容器中
  • 宝塔面板无法打开

    宝塔面板无法打开 在别的应用软件像putty 宝塔等打不开时 xff0c 弹出以下页面 在阿里云官网搜索服务器 rm f www server panel data admin path pl 到底部执行并保存 再次访问宝塔等就可以了
  • 【Ubuntu 安装指定版本RabbitMQ ※便捷版※】

    Ubuntu 16 04 安装 RabbitMQ 3 7 4 第一步 安装 erlang 需要注意 erlang和rabbitmq的版本比对关系 https www rabbitmq com which erlang html 我这里安装的
  • JavaScript 文件对象详解

    在浏览器中操作文件 xff0c 多数情况下用到的是 File 对象 xff0c 从 lt input type 61 39 file 39 gt 元素获取 xff0c 进而继续操作 例如将选择的图片展示在页面上 xff0c 用ajax将文件
  • 协议栈的定义

    所谓协议栈就是对信息进行多次封装和解封的过程 xff0c 以便能够在不同的实体间传送信息 是根据OSI体系模型划分的各层协议的总和 就是一套协议的规范 xff0c 比如HTTP gt TCP gt IP xff0c 一个HTTP请求 xff
  • 死锁,死锁的四个必要条件以及处理策略

    一 什么是死锁二 死锁与饥饿三 资源的类型 3 1 可重用资源和消耗性资源 3 1 1 可重用资源 xff08 永久性资源 xff09 3 1 2 消耗性资源 xff08 临时性资源 xff09 3 2 可抢占资源和不可抢占资源 3 2 1
  • 排查机器 负载过高, ssh进不去问题

    排查路径 xff1a 1 一开始怀疑可能是io阻塞导致 xff0c 于是使用iostat xdm 1 100 xff0c 查看 io状况 xff0c 发现io不高 2 于是使用top xff0c 查看系统负载情况 发现系统负载很高 xff0
  • 什么是奇偶校验

    什么是奇偶校验 对数据传输正确性的一种校验方法 在数据传输前附加一位奇校验位 xff0c 用来表示传输的数据中 34 1 34 的个数是奇数还是偶数 xff0c 为奇数时 xff0c 校验位置为 34 0 34 xff0c 否则置为 34
  • Linux CentOS 7 elasticsearch 设置开机自启

    在 etc systemd system目录下创建elasticsearch service文件 span class token namespace Unit span Description 61 elasticsearch span
  • Centos7 设置开机自启的几种方式

    一 系统服务的方式 1 前提 xff08 1 xff09 首先要将需要自启的软件或应用注册成系统服务 xff0c 下面提供常用的软件注册系统服务的案例 nginx service 创建服务文件 vi usr lib systemd syst
  • ubuntu18.04 server配置 ip地址

    ubuntu18 04 server xff0c 启用了新的网络工具netplan xff0c 下面对齐配置参数进行介绍 1 其网络配置文件是放在 etc netplan yaml 缺省dhcp打开方式 xff0c 如果要配置静态地址 xf
  • Ardupilot基于UWB的定位飞行测试

    拖了许久的测试视频 xff0c 终于要发布了 xff0c 上个版本的代码有点问题 xff0c 没有考虑清楚UWB和NED坐标系的关系 xff0c 导致后面飞行故障不断 xff0c 这款UWB的坐标系为ENU坐标系 xff0c 飞机飞行的坐标
  • AutoBoat自动导航无人船

    AutoBoat 自动导航支持航线规划无人船 AutoBoat是一款功能强大自动驾驶无人船 xff0c 同时还可以搭配多款地面控制站使用 地面站中可以在线升级固件 调参 xff0c 使用一套全双工的无线数据传输系统在地面站与小车之间建立起一
  • PIXHAWK上安装PX4Flow光流传感器及调试过程

    小编最近刚调试完光流传感器 xff0c 效果非常理想 xff0c 无GPS情况下很稳定 小编把调试过程的过程和遇到的问题分享给大家 xff0c 希望大家少走弯路 在安装和调试光流传感器之前 xff0c 先保证旋翼机已经安装和调试完毕 xff
  • 正点原子STM32学习笔记——MPU6050介绍

    一 MPU6050简介 1 什么是MPU6050 xff1f MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件 xff0c 内带3轴陀螺仪和3轴加速度传感器 xff0c 并且含有一个第二IIC接口 xff0c 可
  • 【OFDM系列4】OFDM信号多径信道模型基础知识

    多径信道模型 Multipath Channel Scenario 信道脉冲响应 Channel Impulse Response CIR 信道的复基带脉冲响应如下所示 h t l 1 L a l
  • LACP负载分担配置

    网络拓扑图如下 交换机3的配置 Huawei int Eth Trunk 1 Huawei Eth Trunk1 mode lacp static xff08 负载分担模式设置为LACP模式 xff09 Huawei Eth Trunk1
  • 在 NVIDIA jetson tx2 上基于 realsense d435i 相机运行 vins 相关配置

    在 NVIDIA jetson tx2 上基于 realsense d435i 相机运行 vins 相关配置 一 tx2刷机二 安装librealsense xff0c realsense驱动1 安装依赖库2 从debian reposit
  • linux串口传感器处理接收不完整,数据丢失问题分析

    简介 因为当前项目需要在一个linux系统下进行串口传感器的收发工作 xff0c 该串口传感器的收发使用的是字节流专有协议 xff0c 按照每一个字节的十六进制编码来确定协议数据 按照以往的思路 xff0c 串口就是最简单的外设的思想 xf
  • STM32与上位机串口通讯的学习笔记(简明的数据帧设计方法)

    最近因为项目需要 xff0c 需要做一个STM32和Windows的串口通讯协议来交换数据 xff0c 本着追求极致的心态 xff0c 来讨论一下简明的数据帧的设计方法 数据的传输方式 对于很多单片机初学者而言 xff0c 可能他们接触到串

随机推荐

  • 通讯协议(modbus协议和serial读取数据)

    通讯协议 1 调试助手1 1 crc计算助手1 2 串口调试助手 2 使用serial节点读取数据3 modbus协议3 1 报文3 2 功能号3 2 1主机对从机写数据操作3 2 2主机对从机读数据操作 3 3 MODBUS报文模型 4
  • Qt5开发(一)使用记录

    Qt使用记录 一 QtCreator 快捷使用方式1 快速切换已打开的文件2 快速添加函数3 修改变量名 并应用到所有使用该变量的地方 4 选中光标所在的单词5 删除光标所在行6 其他快捷键7 QtCreator配置代码自动格式化8 快捷键
  • Windows10系统运行msconfig(系统配置)选择安全引导后,登录账户显示密码错误的一种较为简易的解决方法

    问题背景描述 在Windows10环境下 xff0c 由于前几天下载到一个带有极多捆绑软件的文件 xff08 常在河边走 xff0c 哪有不湿鞋 xff09 xff0c 为了删除一个流氓软件 xff0c 于是根据网上文章提示便运行 msco
  • 学习笔记-MATLAB的函数bwconncomp算法解析

    一 说明 bwconncomp函数的作用是在一个二值图像中找出每一个连通分量 xff0c 并返回一个结构体CC xff0c CC中包含了图像及连通分量的一些属性 笔者使用的MATLAB版本为2018a xff0c 且在该版本中 xff0c
  • PX环境搭建编译px4_fmu-v2_default相关问题的解决方法

    背景说明 笔者在ubuntu18 04下搭建PX环境时git clone的是较新版本的PX4 Autopilot链接在此 xff08 而目前网上的教程基本是较老版本的Firmware xff0c 两者文件分布不相同 xff0c 所以已有的方
  • PX4编译过程中报错通用解决办法

    背景说明 时刻两年 xff0c 再次配置PX4环境 xff0c 又踩了一遍坑 xff0c 过程中遇到报错真的是欲哭无泪 xff0c 但是解决完回头再来看其实问题并不复杂 本篇文章面向在PX4 Autopilot目录执行命令 make px4
  • CMakeList使用总结

    一 cmake功能介绍 cmake是跨平台编译工具 xff0c 编写简单好维护 xff0c 是make的高级用法 1 编写CMakeList txt文件 通过cmake生成Makefile文件 xff0c make生成可执行文件 静态库 共
  • Mavlink任务协议

    联系作者QQ 843230304 本文翻译自 https mavlink io en services mission html mission protocol Mavlink任务协议 任务子协议允许GCS或开发人员API 在无人机 组件
  • QGroundControl增加菜单栏新建窗口

    作者qq 843230304 欢迎交流分享 MainWindow h 这个函数创建内部DockWidget xff08 即小窗口 xff09 bool createInnerDockWidget const QString amp widg
  • QGC 的 px4参数元数据文件(固件插件)

    1 QGC 资源位置 qrc FirmwarePlugin PX4 PX4ParameterFactMetaData xml 2 参数组 xml描述 3 每一个参数组里面包含很多参数 4 单个参数 加载固件参数xml文件 connect v
  • vsCode编译器操作git

    用vsCode编译器操作git 超级方便 1 打开cmd拉取项目 2 打开这个项目看一下 3 用vscode打开这个项目 xff0c 是在master分支 xff0c 所以要先新建自己的分支 4 test分支只是个例子哈 5 创建完 xff
  • [Python] ImportError: DLL load failed ... 找不到指定的模块 此类问题解决方法

    文章目录 问题定位结论补充 问题 最近升级 Python 项目 xff0c 由 Python2 7 升级到 Python3 8 3 xff0c 项目使用了 PySide2 xff0c 对于较新的Python3 8 3 PySide2 可能存
  • SVG工具Inkscape使用记录

    1 Q 网上下载的svg xff0c 使用 Inkscape 编辑 xff0c 修改颜色 gt 保存 xff0c 结果颜色并没有修改 A 用文本编辑器打开svg文件 xff0c 删除 path属性中的 fill 61 属性 xff0c 保存
  • [Python] 将py转为 pyc 来保护源码并不实用

    Python 做为一种解释型语言 xff0c 做为服务端程序还好 但如果做为客户端程序 xff0c 就有了暴露源码的问题 很多开发者在寻求安全 便捷的发布程序的方法 比如用pyinstaller xff0c py2exe xff0c 或者转
  • spdlog 封装为 DLL

    项目中需要快速写入巨量日志 xff0c 一开始用的是boost log xff0c 但遇到崩溃问题 xff0c 程序负载大了 xff0c 滚动日志时偶尔会崩溃 xff0c 总是报 xff1a boost filesystem error x
  • 驼峰命名法与下划线命名法之争

    窃以为 xff0c 驼峰命名开发效率更高 xff0c 原因如下 xff1a 下划线命名多输入一个字符 例如 xff1a set name 对比 setName xff0c 多输入一个下划线字符 xff0c 敲击键盘两次Shift 43 而驼
  • [PyQt] 在QLabel上用drawText实现文字滚动

    span class token keyword from span PyQt4 span class token punctuation span QtGui span class token keyword import span sp
  • [PyQt] PyQt4写的音乐播放器

    实现了 xff1a 播放歌曲 xff1b 上 下一首 xff1b 随机 循环 单曲循环 xff1b 批量添加 删除歌曲 xff1b 打开 存储播放列表 xff08 M3U格式 xff09 xff1b 添加到收藏 xff1b 单行 多行歌词桌
  • [PyQt] 使用.qrc 生成资源文件供程序中使用

    建立 images qrc文件 xff0c 里面保存了资源位置 xff1a span class hljs doctype lt DOCTYPE RCC gt span span class hljs tag lt span class h
  • Tcl/tk实例-工具栏和菜单-图片预览工具

    可以打开并查看图片 xff0c 点击工具栏上 Previous 和 Next 按钮来浏览 前 下 一张 仅仅是一个例子 xff0c 其它按钮和菜单未添加命令 package require Ttk package require Img p