前戏:老牌python GUI程序(Tkinter)

  1. import tkinter.messagebox as messagebox
  2.  
  3. class Application(Frame):
  4. def __init__(self,master=None):
  5. Frame.__init__(self,master,bg="red") #设置框架类的父类(基于master<主窗体>),frame可以是看做控件的父容器
  6. self.pack() #显示frame控件
  7. self.createWidgets()
  8.  
  9. def createWidgets(self): #用于创建控件(是frame的子)
  10. self.nameInput = Entry(self)
  11. self.nameInput.pack()
  12. self.alertButton = Button(self,text="Hello",command=self.hello)
  13. self.alertButton.pack()
  14.  
  15. def hello(self):
  16. name = self.nameInput.get()
  17. messagebox.showinfo("Message","Hello, %s"%name)
  18.  
  19. root = Tk()
  20. root.title("标题")
  21. root.wm_minsize(,)
  22.  
  23. app = Application(root)
  24.  
  25. app.mainloop()


前置:各个参数了解:

  1. tkinter模块常用参数(python3)
  2. 、使用tkinter.Tk() 生成主窗口(root=tkinter.Tk());
  3. root.title(‘标题名’)    修改框体的名字,也可在创建时使用className参数来命名;
  4. root.resizable(,)    框体大小可调性,分别表示x,y方向的可变性;
  5. root.geometry(‘250x150’)指定主框体大小;
  6. root.quit()      退出;
  7. root.update_idletasks()
  8. root.update()    刷新页面;
  9.  
  10. 、初级样例:
  11. import tkinter
  12. root=tkinter.Tk() #生成root主窗口
  13. label=tkinter.Label(root,text=’Hello,GUI’) #生成标签
  14. label.pack() #将标签添加到主窗口
  15. button1=tkinter.Button(root,text=’Button1’) #生成button1
  16. button1.pack(side=tkinter.LEFT) #将button1添加到root主窗口
  17. button2=tkinter.Button(root,text=’Button2’)
  18. button2.pack(side=tkinter.RIGHT)
  19. root.mainloop() #进入消息循环(必需组件)
  20.  
  21. tkinter中的15种核心组件:
  22. Button   按钮;
  23. Canvas   绘图形组件,可以在其中绘制图形;
  24. Checkbutton 复选框;
  25. Entry    文本框(单行);
  26. Text   文本框(多行);
  27. Frame   框架,将几个组件组成一组
  28. Label    标签,可以显示文字或图片;
  29. Listbox    列表框;
  30. Menu    菜单;
  31. Menubutton 它的功能完全可以使用Menu替代;
  32. Message Label组件类似,但是可以根据自身大小将文本换行;
  33. Radiobutton 单选框;
  34. Scale    滑块;允许通过滑块来设置一数字值
  35. Scrollbar 滚动条;配合使用canvas, entry, listbox, and text窗口部件的标准滚动条;
  36. Toplevel 用来创建子窗口窗口组件。
  37. (在Tkinter中窗口部件类没有分级;所有的窗口部件类在树中都是兄弟。)
  38.  
  39. 、组件的放置和排版(pack,grid,place)
  40. pack组件设置位置属性参数:
  41. after:     将组件置于其他组件之后;
  42. before:    将组件置于其他组件之前;
  43. anchor:    组件的对齐方式,顶对齐’n’,底对齐’s’,左’w’,右’e
  44. side:     组件在主窗口的位置,可以为’top’,’bottom’,’left’,’right’(使用时tkinter.TOP,tkinter.E);
  45. fill    填充方式 (Y,垂直,X,水平)
  46. expand 1可扩展,0不可扩展
  47. grid组件使用行列的方法放置组件的位置,参数有:
  48. column:   组件所在的列起始位置;
  49. columnspam: 组件的列宽;
  50. row     组件所在的行起始位置;
  51. rowspam   组件的行宽;
  52. place组件可以直接使用坐标来放置组件,参数有:
  53. anchor:  组件对齐方式;
  54. x:    组件左上角的x坐标;
  55. y:    组件右上角的y坐标;
  56. relx:  组件相对于窗口的x坐标,应为0-1之间的小数;
  57. rely: 组件相对于窗口的y坐标,应为0-1之间的小数;
  58. width: 组件的宽度;
  59. heitht:   组件的高度;
  60. relwidth: 组件相对于窗口的宽度,-;
  61. relheight:  组件相对于窗口的高度,-;
  62.  
  63. 、使用tkinter.Button时控制按钮的参数:
  64. anchor: 指定按钮上文本的位置;
  65. background(bg): 指定按钮的背景色;
  66. bitmap: 指定按钮上显示的位图;
  67. borderwidth(bd):指定按钮边框的宽度;
  68. command: 指定按钮消息的回调函数;
  69. cursor: 指定鼠标移动到按钮上的指针样式;
  70. font: 指定按钮上文本的字体;
  71. foreground(fg):指定按钮的前景色;
  72. height: 指定按钮的高度;
  73. image: 指定按钮上显示的图片;
  74. state: 指定按钮的状态(disabled);
  75. text: 指定按钮上显示的文本;
  76. width: 指定按钮的宽度
  77. padx 设置文本与按钮边框x的距离,还有pady;
  78. activeforeground按下时前景色
  79. textvariable 可变文本,与StringVar等配合着用
  80.  
  81. 、文本框tkinter.Entry,tkinter.Text控制参数:
  82. background(bg) 文本框背景色;
  83. foreground(fg) 前景色;
  84. selectbackground选定文本背景色;
  85. selectforeground选定文本前景色;
  86. borderwidth(bd) 文本框边框宽度;
  87. font   字体;
  88. show    文本框显示的字符,若为*,表示文本框为密码框;
  89. state    状态;
  90. width     文本框宽度
  91. textvariable   可变文本,与StringVar等配合着用
  92.  
  93. 、标签tkinter.Label组件控制参数:
  94. Anchor     标签中文本的位置;
  95. background(bg)  背景色;
  96. foreground(fg)   前景色;
  97. borderwidth(bd)  边框宽度;
  98. width      标签宽度;
  99. height     标签高度;
  100. bitmap     标签中的位图;
  101. font     字体;
  102. image     标签中的图片;
  103. justify     多行文本的对齐方式;
  104. text        标签中的文本,可以使用’\n’表示换行
  105. textvariable    显示文本自动更新,与StringVar等配合着用
  106.  
  107. 、单选框和复选框Radiobutton,Checkbutton控制参数:
  108. anchor   文本位置;
  109. background(bg) 背景色;
  110. foreground(fg) 前景色;
  111. borderwidth 边框宽度;
  112. width    组件的宽度;
  113. height    组件高度;
  114. bitmap    组件中的位图;
  115. image    组件中的图片;
  116. font    字体;
  117. justify    组件中多行文本的对齐方式;
  118. text    指定组件的文本;
  119. value    指定组件被选中中关联变量的值;
  120. variable   指定组件所关联的变量;
  121. indicatoron 特殊控制参数,当为0时,组件会被绘制成按钮形式;
  122. textvariable 可变文本显示,与StringVar等配合着用
  123.  
  124. 、组图组件Canvas控制参数:
  125. background(bg) 背景色;
  126. foreground(fg) 前景色;
  127. borderwidth    组件边框宽度;
  128. width      组件宽度;
  129. height    高度;
  130. bitmap    位图;
  131. image      图片;
  132. 绘图的方法主要以下几种:
  133. create_arc 圆弧;
  134. create_bitmap 绘制位图,支持XBM;
  135. create_image 绘制图片,支持GIF(x,y,image,anchor);
  136. create_line 绘制支线;
  137. create_oval; 绘制椭圆;
  138. create_polygon 绘制多边形(坐标依次罗列,不用加括号,还有参数,fill,outline);
  139. create_rectangle 绘制矩形((a,b,c,d),值为左上角和右下角的坐标);
  140. create_text 绘制文字(字体参数font,);
  141. create_window 绘制窗口;
  142. delete   删除绘制的图形;
  143. itemconfig 修改图形属性,第一个参数为图形的ID,后边为想修改的参数;
  144. move    移动图像(,,),1为图像对象,4为横移4像素,0为纵移像素,然后用root.update()刷新即可看到图像的移动,为了使多次移动变得可视,最好加上time.sleep()函数;
  145. 只要用create_方法画了一个图形,就会自动返回一个ID,创建一个图形时将它赋值给一个变量,需要ID时就可以使用这个变量名。
  146. coords(ID) 返回对象的位置的两个坐标(4个数字元组);
  147.  
  148. 对于按钮组件、菜单组件等可以在创建组件时通过command参数指定其事件处理函数。方法为bind;或者用bind_class方法进行类绑定,bind_all方法将所有组件事件绑定到事件响应函数上。
  149.  
  150. 、菜单Menu
  151. 参数:
  152. tearoff   分窗,0为在原窗,1为点击分为两个窗口
  153. bg,fg    背景,前景
  154. borderwidth 边框宽度
  155. font   字体
  156. activebackgound 点击时背景,同样有activeforegroundactiveborderwidthdisabledforeground
  157. cursor
  158. postcommand
  159. selectcolor  选中时背景
  160. takefocus
  161. title
  162. type
  163. relief
  164.  
  165. 方法:
  166. menu.add_cascade 添加子选项
  167. menu.add_command 添加命令(label参数为显示内容)
  168. menu.add_separator 添加分隔线
  169. menu.add_checkbutton添加确认按钮
  170. delete    删除
  171.  
  172. 、事件关联
  173. bind(sequence,func,add)——
  174. bind_class(className,sequence,func,add)
  175. bind_all(sequence,func,add)
  176. 事件参数:
  177. sequence 所绑定的事件;
  178. func 所绑定的事件处理函数;
  179. add 可选参数,为空字符或‘+’;
  180. className 所绑定的类;
  181.  
  182. 鼠标键盘事件
  183.   鼠标左键按下,2表示中键,3表示右键;
  184.  同上;
  185.  鼠标左键释放;
  186.    按住鼠标左键移动;
  187. 双击左键;
  188.    鼠标指针进入某一组件区域;
  189.    鼠标指针离开某一组件区域;
  190.   滚动滚轮;
  191.    按下A键,A可用其他键替代;
  192.   同时按下altAalt可用ctrlshift替代;
  193. 快速按两下A
  194.  大写状态下按A
  195.  
  196. 窗口事件
  197. Activate 当组件由不可用转为可用时触发;
  198. Configure 当组件大小改变时触发;
  199. Deactivate 当组件由可用转变为不可用时触发;
  200. Destroy 当组件被销毁时触发;
  201. Expose 当组件从被遮挡状态中暴露出来时触发;
  202. Unmap 当组件由显示状态变为隐藏状态时触发;
  203. Map 当组件由隐藏状态变为显示状态时触发;
  204. FocusIn 当组件获得焦点时触发;
  205. FocusOut 当组件失去焦点时触发;
  206. Property 当窗体的属性被删除或改变时触发;
  207. Visibility 当组件变为可视状态时触发;
  208.  
  209. 响应事件
  210. event对象(def function(event)):
  211. char 按键字符,仅对键盘事件有效;
  212. keycode 按键名,仅对键盘事件有效;
  213. keysym 按键编码,仅对键盘事件有效;
  214. num 鼠标按键,仅对鼠标事件有效;
  215. type 所触发的事件类型;
  216. widget 引起事件的组件;
  217. width,heigh组件改变后的大小,仅Configure有效;
  218. x,y   鼠标当前位置,相对于窗口;
  219. x_root,y_root 鼠标当前位置,相对于整个屏幕
  220.  
  221. 、弹窗
  222. messagebox._show函数的控制参数:
  223. default 指定消息框按钮;
  224. icon 指定消息框图标;
  225. message 指定消息框所显示的消息;
  226. parent 指定消息框的父组件;
  227. title 标题;
  228. type 类型;
  229.  
  230. simpledialog模块参数:
  231. title    指定对话框的标题;
  232. prompt   显示的文字;
  233. initialvalue 指定输入框的初始值;
  234.  
  235.   filedialog   模块参数:
  236. filetype    指定文件类型;
  237. initialdir    指定默认目录;
  238. initialfile    指定默认文件;
  239. title     指定对话框标题
  240.  
  241. colorchooser模块参数:
  242. initialcolor    指定初始化颜色;
  243. title    指定对话框标题;
  244.  
  245. 、字体(font)
  246. 一般格式:
  247. (’Times - bold’)
  248. (‘Times’,,’bold’,’italic’) 依次表示字体、字号、加粗、倾斜
  249.  
  250. 补充:
  251. config 重新配置
  252. label.config(font=’Arial -%d bold % scale.get())
  253. 依次为字体,大小(大小可为字号大小),加粗
  254. tkinter.StringVar 能自动刷新的字符串变量,可用setget方法进行传值和取值,类似的还有IntVar,DoubleVar

常用参数

常用参数大总结


label:


  1. def callback():
  2. var.set("hhhhhhh")
  3.  
  4. root = Tk()
  5.  
  6. var = StringVar()
  7. var.set("")
  8.  
  9. frame1 = Frame(root)
  10. frame2 = Frame(root)
  11.  
  12. lb = Label(frame1,textvariable=var,padx=)
  13. lb.pack(side=LEFT)
  14.  
  15. # img = Image(file="1.gif",imgtype="photo")
  16. img = PhotoImage(file="1.gif")
  17. lb2 = Label(frame1,image=img)
  18. lb2.pack(side=RIGHT)
  19.  
  20. btnCm = Button(frame2,text="下一步",command=callback)
  21. btnCm.pack()
  22.  
  23. frame1.pack()
  24. frame2.pack()
  25.  
  26. root.mainloop()

label标签的使用(使用图片)


Checkbutton:


  1. from tkinter import *
  2.  
  3. root =Tk()
  4.  
  5. v = IntVar() #选中为1,未选中为0
  6.  
  7. c = Checkbutton(root,text="Test",variable=v)
  8. c.pack()
  9.  
  10. l = Label(root,textvariable=v)
  11. l.pack()
  12.  
  13. root.mainloop()

Checkbutton使用(1)

  1. from tkinter import *
  2.  
  3. root =Tk()
  4.  
  5. GIRLS = ["asd",'dsa','fef','fwaf']
  6.  
  7. v = []
  8.  
  9. def change():
  10. for i in v:
  11. print(i.get())
  12.  
  13. for girl in GIRLS:
  14. v.append(IntVar())
  15. b = Checkbutton(root,text=girl,variable=v[-],command=change) #使用一个固有变量来记录状态
  16. b.pack(anchor=W) #控件相对主窗口在左边
  17.  
  18. root.mainloop()

Checkbutton的使用(2)


Radiobutton:


  1. #对于单选框,多个按钮只对应一个变量,复选框,多个按钮对应多个值
  2. from tkinter import *
  3.  
  4. def change():
  5. print(v.get())
  6.  
  7. root = Tk()
  8.  
  9. v = IntVar()
  10.  
  11. Radiobutton(root,text="one",variable=v,value=,command=change).pack(anchor=W)
  12. Radiobutton(root,text="two",variable=v,value=,command=change).pack(anchor=W)
  13. Radiobutton(root,text="three",variable=v,value=,command=change).pack(anchor=W)
  14.  
  15. root.mainloop()

Radiobutton的使用(1)

  1. from tkinter import *
  2.  
  3. def change():
  4. print(v.get())
  5.  
  6. root = Tk()
  7. v = IntVar()
  8.  
  9. Langes = [
  10. ("python",),
  11. ("javascript",),
  12. ("Lua",),
  13. ("Ruby",)
  14. ]
  1. group = LabelFrame(root,text="选择喜欢的语言",padx=5,pady=5)
    group.pack(padx=10,pady=10)
  1. for key,val in Langes:
  2. Radiobutton(group,text=key,variable=v,value=val,command=change).pack(anchor=W)
  3.  
  4. root.mainloop()

Radiobutton的使用(2)

  1. #对于单选框,多个按钮只对应一个变量,对于复选框,多个按钮对应多个值(使用列表获取)
  1. 注意:
  2. root = Tk()
  3. v = IntVar()
  4. 这里我们声明的变量全部应该写在主窗口生成后,才可以

  1. 不然当我们将变量写在主窗口生成前
  2. v = IntVar()
  3. root = Tk()
  4. 会报错
  5. AttributeError: 'NoneType' object has no attribute '_root'
  1. .首先进入IntVar
  2. class IntVar(Variable):
  3. def __init__(self, master=None, value=None, name=None):
  4. Variable.__init__(self, master, value, name)
  5. .进入父类
  6. class Variable:
  7. def __init__(self, master=None, value=None, name=None):
  8. ...
  9. if not master: #看此处(master是主窗口,是传参,但是我们使用的时候并没有传入,所以为空,进入下面代码)
  10. master = _default_root #_default_root是什么
  11. self._root = master._root()
  12. self._tk = master.tk
  13. ...
  14. ._default_root查找
  15. _support_default_root = #也有用,后面看
  16. _default_root = None #是一个全局变量,代表主窗口
  17. 但是他也为空,所以出现了上面的属性错误,None没有_root()方法
  18. ------------------------------------------------------------------
  19.  
  20. 开始查看Tk()
  21. root = Tk()
  22. .查看源码
  23. class Tk(Misc, Wm):
  24. def __init__(self, screenName=None, baseName=None, className='Tk',
  25. useTk=, sync=, use=None):
  26. ...
  27. if useTk: #这里默认传入1,进入下面逻辑
  28. self._loadtk()
  29. ...
  30. .查看self._loadtk()方法
  31.  
  32. def _loadtk(self):
  33. self._tkloaded =
  34. global _default_root
  35. # Version sanity checks
  36. ......
  37. # Create and register the tkerror and exit commands
  38. # We need to inline parts of _register here, _ register
  39. # would register differently-named commands.
  40. ......
  41. if _support_default_root and not _default_root: #查看上面的全局变量,发现可以进入下面的逻辑代码中
  42. _default_root = self #所以_default_root就是主窗口
  43. ......
  44. ------------------------------------------------------------------
  45.  
  46. 结论:由上面发现可以知道:
  47. IntVar等变量的使用需要_default_root(当我们没有传入master时),而主窗口生成root=Tk()时,内部代码将_default_root实现了。所以两者顺序需要保证先后

原因:源码分析


Entry:


  1. from tkinter import *
  2.  
  3. root = Tk()
  4.  
  5. input = Entry(root)
  6. input.pack(padx=,pady=)
  7.  
  8. input.delete(, END) #先清空按照索引
  9. input.insert(,"请输入内容...")
  10.  
  11. root.mainloop()

Entry的使用(1)

  1. from tkinter import *
  2.  
  3. root = Tk()
  4.  
  5. Lb1 = Label(root,text="作品:").grid(row=,column=)
  6. Lb1 = Label(root,text="作者:").grid(row=,column=)
  7.  
  8. Ip1 = Entry(root)
  9. Ip1.grid(row=,column=,padx=,pady=)
  10. Ip2 = Entry(root)
  11. Ip2.grid(row=,column=,padx=,pady=)
  12.  
  13. def show():
  14. print("作品:《%s》"%Ip1.get())
  15. print("作者:%s"%Ip2.get())
  16.  
  17. Button(root,text="获取数据",command=show).grid(row=,column=,sticky=W,padx=,pady=)
  18. Button(root,text="退出",command=root.quit).grid(row=,column=,sticky=E,padx=,pady=)
  19.  
  20. root.mainloop()

Entry的使用(2)

  1. from tkinter import *
  2.  
  3. root = Tk()
  4.  
  5. Lb1 = Label(root,text="账号:").grid(row=,column=)
  6. Lb1 = Label(root,text="密码:").grid(row=,column=)
  7.  
  8. v1 = StringVar()
  9. v2 = StringVar()
  10.  
  11. Ip1 = Entry(root)
  12. Ip1.grid(row=,column=,padx=,pady=)
  13. Ip2 = Entry(root,show="*")
  14. Ip2.grid(row=,column=,padx=,pady=)
  15.  
  16. def show():
  17. print("账号:%s"%Ip1.get())
  18. print("密码:%s"%Ip2.get())
  19.  
  20. Button(root,text="获取数据",command=show).grid(row=,column=,sticky=W,padx=,pady=)
  21. Button(root,text="退出",command=root.quit).grid(row=,column=,sticky=E,padx=,pady=)
  22.  
  23. root.mainloop()

Entry的使用(密码设置)

  1. from tkinter import *
  2.  
  3. root = Tk()
  4.  
  5. Lb1 = Label(root,text="账号:").grid(row=,column=)
  6. Lb1 = Label(root,text="密码:").grid(row=,column=)
  7.  
  8. def test():
  9. if Ip1.get() == "root":
  10. print("正确")
  11. return True
  12. else:
  13. print("错误")
  14. Ip1.delete(,END)
  15. return False
  16.  
  17. Ip1 = Entry(root,validate="focusout",validatecommand=test)
  18. Ip1.grid(row=,column=,padx=,pady=)
  19. Ip2 = Entry(root,show="*")
  20. Ip2.grid(row=,column=,padx=,pady=)
  21.  
  22. root.mainloop()

Entry的使用(事件处理<焦点>和数据验证validatecommand)

  1. #注意:只有当validatecommand验证失败,才会去触发invalidcommand事件.是为了避免函数过长,而且是代码简便
  2. from tkinter import *
  3.  
  4. root = Tk()
  5.  
  6. Lb1 = Label(root,text="账号:").grid(row=,column=)
  7. Lb1 = Label(root,text="密码:").grid(row=,column=)
  8.  
  9. def test():
  10. if Ip1.get() == "root":
  11. print("正确")
  12. return True
  13. else:
  14. print("错误")
  15. Ip1.delete(,END)
  16. return False
  17.  
  18. def test2():
  19. print("数据验证失败,我被调用...")
  20.  
  21. Ip1 = Entry(root,validate="focusout",validatecommand=test,invalidcommand=test2)
  22. Ip1.grid(row=,column=,padx=,pady=)
  23. Ip2 = Entry(root,show="*")
  24. Ip2.grid(row=,column=,padx=,pady=)
  25.  
  26. root.mainloop()

Entry的使用(invalidcommand)

  1. 对于Entry中的get方法获取数据和textvariable参数中的StringVar类型数据的使用区别:
  2. ---------------------------------------------------------------------
  3. v1 = StringVar()
  4.  
  5. Ip1 = Entry(root,textvariable=v1,validate="focusout",validatecommand=test,invalidcommand=test2)
  6.  
  7. Ip1.get()
  8. v1.get()
  9. ---------------------------------------------------------------------
  10. 控件的get方法能够获取任何时候的输入框中的数据。
  11. textvariable中的值,当存在validate验证时,只有当验证通过后才会被赋值给变量textvariable

补充:输入框的事件:

  1. focus: 获得或失去时都调用
  2. focusin: 获得焦点时调用
  3. focusout: 失去焦点时
  4. key: 当输入框被编辑时,(有按键输入)
  5. none: 不会开启验证(默认),注意是字符none,不是None

补充:上面的验证函数都是没有参数的,随意添加参会报错

  1. TypeError: test2() missing required positional argument: '..'

那么如何传入参数?Tkinter为验证函数提供了一些参数

参数 含义
%d 操作(触发事件)代码:0表示删除时触发,1插入时,2获得,失去焦点或textvariable值被修改
%i

1.当用户尝试插入或删除操作的时候,该选项表示插入或删除的位置(索引号)

2.如果是由于获得,失去焦点或者textvariable值被修改,而调用验证函数,该值是-1

%P

1.当输入框的值允许改变的时候,该值有效

2.该值为输入框的最新文本

%s  该值为调用验证函数前输入框的文本内容
%S 

1.当插入或删除操作触发验证函数的时候,该值有效

2.该选项仅仅表示被插入或删除的值

%v   该组件当前的validate选项的值(触发条件)
%V 

1.调用验证函数的原因(触发条件)

2.focusin,focusout,key,forced(textvariable值被修改)

%W  该组件的名称(该控件的id)
  1. from tkinter import *
  2.  
  3. root = Tk()
  4.  
  5. Lb1 = Label(root,text="账号:").grid(row=,column=)
  6. Lb1 = Label(root,text="密码:").grid(row=,column=)
  7.  
  8. def test():
  9. if Ip1.get() == "root":
  10. print("正确")
  11. return True
  12. else:
  13. print("错误")
  14. Ip1.delete(,END)
  15. return False
  16.  
  17. def test2(p_con,s_con,v_func,v_res,w_name):
  18. print(p_con,s_con,v_func,v_res,w_name) #waff waff focusout focusout .(和下面的id(Ip1)一致)
  19. return True
  20.  
  21. v1 = StringVar()
  22. v2 = StringVar()
  23.  
  24. #注意使用前需要先进行注册
  25. testCMD = root.register(test2)
  26.  
  27. Ip1 = Entry(root,textvariable=v1,validate="focusout",validatecommand=(testCMD,"%P","%s","%v","%V","%W"))
  28.  
  29. print(id(Ip1)) #
  30.  
  31. Ip1.grid(row=,column=,padx=,pady=)
  32. Ip2 = Entry(root,show="*")
  33. Ip2.grid(row=,column=,padx=,pady=)
  34.  
  35. root.mainloop()

额外参数测试

当然上面的只是提供的特殊参数,我们可以传入自己想要传递的数据,不过,这些自定义函数都是需要我们进行注册。

  1. def test(a,b):
  2. print(a,b)
  3. if Ip1.get() == "root":
  4. print("正确")
  5. return True
  6. else:
  7. print("错误")
  8. Ip1.delete(,END)
  9. return False
  10.  
  11. testCMD2 = root.register(test)
  12.  
  13. he = "hhhhh"
  14. ll = "gun"
  15.  
  16. Ip1 = Entry(root,textvariable=v1,validate="focusout",validatecommand=(testCMD2,he,ll))
  17.  
  18. ------------------------------------------------------------------
  19. hhhhh gun
  20. 正确

自定义参数传递

  1. from tkinter import *
  2.  
  3. root = Tk()
  4.  
  5. v1 = StringVar()
  6. v2 = StringVar()
  7. v3 = StringVar()
  8.  
  9. def test(content):
  10. if content.isdigit():
  11. return True
  12. else:
  13. return False
  14.  
  15. def calc():
  16. res = int(v1.get())+int(v2.get())
  17. v3.set(res)
  18.  
  19. testCMD = root.register(test)
  20.  
  21. e1 = Entry(root,textvariable=v1,validate="key",validatecommand=(testCMD,"%P")).grid(row=,column=)
  22.  
  23. Lb1 = Label(root,text="+").grid(row=,column=)
  24.  
  25. e2 = Entry(root,textvariable=v2,validate="key",validatecommand=(testCMD,"%P")).grid(row=,column=)
  26.  
  27. Label = Label(root,text="=").grid(row=,column=)
  28.  
  29. e3 = Entry(root,textvariable=v3,state="readonly").grid(row=,column=)
  30.  
  31. Button(root,text="求和",command=calc).grid(row=,column=)
  32.  
  33. root.mainloop()

Entry案例(求和操作)


补充:布局的pack和grid,和place区别


  1. 我们使用 pack 函数的时候,默认先使用的放到上面,然 依次向下排,它会给我们的组件一个自认为合适的位置 和大小,这是默认方式。
  2. 无严格界限要求。(简单布局推荐)
  3.  
  4. grid是严格按照表格的行列进行划分区域的,需要我们提前进行设计,灵活程度低于pack,但是对于我们理解更加容易(学习推荐)
  5.  
  6. place:允许用户指定组件的大小和位置(不推荐,但是在某些情况有妙用)
  7.  
  8. 注意:packgrid不要混用,不然无法进行
  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. photo = PhotoImage(file="1.gif")
  6. Lable(master,image=photo).pack() #会被button覆盖
  7.  
  8. def click():
  9. print("center")
  10.  
  11. Button(master,text="create",command=click).place(relx=0.5,rely=0.5,anchor=CENTER) #relx和rely是设置在窗口的位置在中间,anchor是设置这个控件相对于窗口中间的位置
  12.  
  13. master.mainloop()

place设置居中

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. Label(master,bg="red").place(relx=0.5,rely=0.5,relheight=0.75,relwidth=0.75,anchor=CENTER)
  6.  
  7. Label(master,bg="green").place(relx=0.5,rely=0.5,relheight=0.5,relwidth=0.5,anchor=CENTER)
  8.  
  9. Label(master,bg="blue").place(relx=0.5,rely=0.5,relheight=0.25,relwidth=0.25,anchor=CENTER)
  10.  
  11. master.mainloop()

place的部分参数

继续说说pack中的参数:

  1.   side:按扭停靠在窗口的哪个位置
  2.  
  3.     left:
  4.  
  5.     top:
  6.  
  7.     right:
  8.  
  9.     botton:
  10.  
  11.   fill:填充
  12.  
  13.     x:水平方向填充
  14.  
  15.     y:竖直方向填充
  16.  
  17.     both:水平和竖直方向填充
  18.  
  19.     none:不填充
  20.  
  21.   expand:
  22.  
  23.     yes:扩展整个空白区
  24.  
  25.     no:不扩展
  26.  
  27.   anchor:
  28.  
  29.     N:北
  30.  
  31.     E:东
  32.  
  33.     S:南
  34.  
  35.     W:西
  36.  
  37.     CENTER:中间
  38.  
  39.   padx:x方向的外边距
  40.  
  41.   pady:y方向的外边距
  42.  
  43.   ipadx:x方向的内边距
  44.  
  45.   ipadyy方向的内边距

pack中的参数

代码测试:

  1. from tkinter import *
  2. root = Tk()
  3. Button(root,text='A').pack(side=LEFT,expand=NO,fill=Y)
  4. Button(root,text='B').pack(side=TOP,expand=NO,fill=BOTH)
  5. Button(root,text='C').pack(side=RIGHT,expand=NO,fill=NONE)
  6. Button(root,text='D').pack(side=LEFT,expand=NO,fill=Y)
  7. Button(root,text='E').pack(side=TOP,expand=NO,fill=BOTH)
  8. Button(root,text='F').pack(side=BOTTOM,expand=NO)
  9. Button(root,text='G').pack(anchor=SE)
  10. root.mainloop()

注意:expand,当你拉动窗口时(放大),所有你设置为允许扩充的控件都会去改变形状扩展空白区域(注意,我们设置的fill填充参数,当我们改变窗口大小时,也会随着设置的方向进行改变<前提是布局未被限制>)

  1. Button(root,text='A').pack(side=LEFT,expand=YES,fill=Y)

expand:占据空白区域

fill:会填充设置的方向Y

至于grid就不再多说


Listbox:


  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. Lb = Listbox(master)#设置多选selectmode=EXTENDED
  6.  
  7. Lb.pack()
  8.  
  9. for item in ["福娃","f非","各方",'端口']:
  10. Lb.insert(END,item) #插入方向,从后方...(是按照索引来的)
  11.  
  12. Btn = Button(master,text="删除当前选中",command=lambda x=Lb:x.delete(ACTIVE))
  13. Btn.pack()
  14. master.mainloop()

Listbox的使用(默认单选,可以设置多选)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. Lb = Listbox(master,selectmode=EXTENDED,)
  6.  
  7. Lb.pack()
  8.  
  9. for item in range():
  10. Lb.insert(END,item) #插入方向,从后方...(是按照索引来的)
  11.  
  12. def del_lb():
  13. ls = list(Lb.curselection())
  14. ls.reverse() #需要先翻转过来,在从后向前删除(不然删除会导致索引不及时,删错元素)
  15.  
  16. for index in ls:
  17. Lb.delete(index)
  18.  
  19. Btn = Button(master,text="删除当前选中",command=del_lb)
  20. Btn.pack()
  21. master.mainloop()

Listbox的使用(多选删除)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. #:生成滚动条
  6. sb = Scrollbar(master)
  7. sb.pack(side=RIGHT,fill=Y)
  8.  
  9. #:生成ListBox,将其与滚动条相关联,yscrollcommand (单向关联<Listbox去改变ScrollBar>:鼠标滚轮滚动内容,滚动条会滑动,但是滚动条变化时,内容不会变化)
  10. Lb = Listbox(master,selectmode=EXTENDED,height=,yscrollcommand=sb.set) #默认显示10条,我们可以设置滚轮或者height行数
  11. Lb.pack()
  12.  
  13. #:将滚动条滚动事件与ListBox的视图显示相关联 (单向关联<ScrollBar去改变Listbox>:滚动条变化时,内容会变化)
  14. sb.config(command=Lb.yview)
  15.  
  16. #注意:2和3相关联会获得我们想要的结果
  17.  
  18. for item in range():
  19. Lb.insert(END,item) #插入方向,从后方...(是按照索引来的)
  20.  
  21. master.mainloop()

Listbox的使用(ScrollBar的使用)(ScrollBar和Listbox相互关联:ScrollBar中config和Listbox中的yscrollcommand)


Scale:


  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. s1 = Scale(master,from_ =, to =) #默认是垂直的
  6. s1.pack()
  7.  
  8. s2 = Scale(master,from_=,to=,orient=HORIZONTAL) #设置为水平
  9. s2.pack()
  10.  
  11. Button(master,text="获取数值",command=lambda :print(s1.get(),s2.get())).pack()
  12.  
  13. master.mainloop()

Scale的使用(相对于ScrollBar可以设置滚动范围<默认垂直,使用orient修改水平>)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. s1 = Scale(master,from_ =, to =,tickinterval=) #tickinterval是设置分为几份
  6. s1.pack()
  7.  
  8. s2 = Scale(master,from_=,to=,orient=HORIZONTAL,resolution=) #resolution设置每次移动的固定步长
  9. s2.pack()
  10.  
  11. Button(master,text="获取数值",command=lambda :print(s1.get(),s2.get())).pack()
  12.  
  13. master.mainloop()

Scale的固定步长resolution和均分数量tickinterval(将范围分为几份,并且显示刻度)


Text:功能多(方法多)


  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. text = Text(master,width=,height=)
  6. text.pack()
  7.  
  8. # Special tags, marks and insert positions
  9. # SEL='sel' #选择的文字被替换
  10. # SEL_FIRST='sel.first' #选中的文字的前面插入
  11. # SEL_LAST='sel.last' #选中的文字后面被插入
  12. # END='end' #在当前文档结尾插入
  13. # INSERT='insert' #在当前光标位置插入
  14. # CURRENT='current' #在当前位置插入
  15. # ANCHOR='anchor'
  16. # ALL='all' # e.g. Canvas.delete(ALL)
  17.  
  18. # def insert(self, index, chars, *args):
  19. # """Insert CHARS before the characters at INDEX. An additional
  20. # tag can be given in ARGS. Additional CHARS and tags can follow in ARGS."""
  21. # self.tk.call((self._w, 'insert', index, chars) + args)
  22.  
  23. text.insert(INSERT,"")
  24.  
  25. text.insert(END,"")
  26.  
  27. text.insert(CURRENT,"")
  28.  
  29. text.insert(INSERT,"")
  30.  
  31. master.mainloop()

Text的使用(功能多样,甚至可以显示图片,链接,html和网页浏览)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. text = Text(master,width=,height=)
  6. text.pack()
  7.  
  8. # Special tags, marks and insert positions
  9. # SEL='sel' #选择的文字被替换
  10. # SEL_FIRST='sel.first' #选中的文字的前面插入
  11. # SEL_LAST='sel.last' #选中的文字后面被插入
  12. # END='end' #在当前文档结尾插入
  13. # INSERT='insert' #在当前光标位置插入
  14. # CURRENT='current' #在当前位置插入
  15. # ANCHOR='anchor'
  16. # ALL='all' # e.g. Canvas.delete(ALL)
  17.  
  18. # def insert(self, index, chars, *args):
  19. # """Insert CHARS before the characters at INDEX. An additional
  20. # tag can be given in ARGS. Additional CHARS and tags can follow in ARGS."""
  21. # self.tk.call((self._w, 'insert', index, chars) + args)
  22.  
  23. text.insert(INSERT,"")
  24.  
  25. text.insert(END,"")
  26.  
  27. photo = PhotoImage(file="1.gif") #注意photo对象写在函数体外,若在函数体中,生存周期一到,就会被释放。无法显示。,解释如下面所述
  28.  
  29. def show(): #此时是事件button点击,进入处理,处理后,才会进入IO循环中去显示数据,若是数据在函数体中被回收,那么久无法显示出来
  30. a = "adsafafw" #字符串是被存放在常量区,不会被删除的,所以两个的id是一致的
  31. text.image_create(INSERT,image=photo)
  32. text.insert(END,a)
  33. print(id(a)) #
  34.  
  35. def test():
  36. b = "adsafafw"
  37. print(id(b)) # 和上面的数据a都是在函数体中,id一致。是使用的一个数据(存放在常量区)
  38.  
  39. test()
  40.  
  41. btn = Button(text,text="试试看",command=show)
  42.  
  43. text.window_create(INSERT,window=btn) #要想显示控件,需要将text设置为窗口("""Create a window at INDEX.""")
  44.  
  45. master.mainloop()

Text的使用(插入图片和控件)(强行回顾一次函数体中数据的生存周期)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. text = Text(master,width=,height=)
  6. text.pack()
  7.  
  8. text.insert(CURRENT,"adfwgthjdjxc")
  9. #注意行数是从1开始,列数是从0开始,索引写法可以使用小数点连接:1.2---第一行第3列 特殊:行.end(该行最后的索引),特殊的需要使用引号
  10. txt = text.get(1.2,'1.end') #"""Return the text from INDEX1 to INDEX2 (not included)."""
  11. txt2 = text.get(1.1,1.6)
  12. print(txt,txt2) #fwgthjdjxc dfwgt
  13.  
  14. master.mainloop()

Text的使用(索引行列)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. text = Text(master,width=,height=)
  6. text.pack()
  7.  
  8. text.insert(CURRENT,"fgweagawgrhssdf")
  9.  
  10. #Marks标记
  11.  
  12. #.简单使用:
  13. text.mark_set("bj","1.3") #在1.3处设置标记,名为bj,就像书签一样,方便操作。注意mark_set和mark_unset对应
  14. #默认标记是记住右边的那个字符(第一次设置后就跟定他了)e字符
  15. text.insert("bj","") #fgw66eagawgrhssdf 向e字符左端插入
  16. text.insert("bj",'') #fgw6688eagawgrhssdf 还是向e字符左端插入
  17. text.mark_unset("bj")
  18.  
  19. text.delete(1.0,END) #清空数据
  20.  
  21. #.标志被删除了之后的反应:
  22. text.insert(CURRENT,"fgweagawgrhssdf")
  23. text.mark_set("bj","1.3") #在1.3处设置标记,名为bj,就像书签一样,方便操作。注意mark_set和mark_unset对应
  24. text.delete(1.2,1.5) #注意当标记位置被删除了的话,会自动寻找到删除的字符串的下一个字符,以他为标志
  25. #删除字符串后面的那个紧接的字符是g,以他为标志
  26. text.insert("bj","") #fg66gawgrhssdf 向g字符左端插入
  27. text.insert("bj",'') #fg6688gawgrhssdf 还是向g字符左端插入
  28. text.mark_unset("bj")
  29.  
  30. text.delete(1.0,END)
  31.  
  32. #.前面都是以标志位为基准,放在右边。修改将标志位放在左边:mark_gravity
  33. text.insert(CURRENT,"fgweagawgrhssdf")
  34. text.mark_set("bj","1.3") #在1.3处设置标记,名为bj,就像书签一样,方便操作。注意mark_set和mark_unset对应
  35. text.mark_gravity("bj",LEFT)
  36. #默认标记是记住右边的那个字符(第一次设置后就跟定他了)e字符
  37. text.insert("bj","") #fgw66eagawgrhssdf 向e字符左端插入
  38. text.insert("bj",'') #fgw6688eagawgrhssdf 还是向e字符左端插入
  39. text.mark_unset("bj")
  40.  
  41. master.mainloop()

Text的使用(Marks标记)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. text = Text(master,width=,height=)
  6. text.pack()
  7.  
  8. text.insert(CURRENT,"gag g efwa h eshhe fawf")
  9.  
  10. text.tag_add("tag1","1.7","1.12","1.16") #索引双数为范围,单数为一个字符
  11. text.tag_config("tag1",background="yellow",foreground="white") #config是设置样式 foreground是前景色,字体颜色
  12. #新样式覆盖旧样式
  13. text.tag_add("tag2","1.9","1.12") #索引双数为范围,单数为一个字符
  14. text.tag_config("tag2",background="blue",foreground="white") #config是设置样式 foreground是前景色,字体颜色
  15.  
  16. #设置tag的优先级:作用就是较低的优先级样式是无法覆盖高优先级的
  17. text.tag_lower("tag2") #降低
  18. # text.tag_raise("tag1") #提高
  19.  
  20. master.mainloop()

Text的使用(tag使用:可以对内容进行样式修改)

  1. from tkinter import *
  2. import webbrowser
  3.  
  4. master = Tk()
  5.  
  6. text = Text(master,width=,height=,selectbackground="green")
  7. text.pack()
  8.  
  9. text.insert(CURRENT,"gag g efwa h eshhe fawf")
  10.  
  11. text.tag_add("a","1.7","1.12","1.16") #索引双数为范围,单数为一个字符
  12. text.tag_config("a",background="yellow",foreground="red",underline=True,font="") #config是设置样式 foreground是前景色,字体颜色
  13.  
  14. def show_arrow_cursor(*args):
  15. text.config(cursor="arrow") #箭头
  16.  
  17. def show_xterm_cursor(*args):
  18. text.config(cursor="xterm") #光标线
  19.  
  20. def click(*args):
  21. webbrowser.open("http://www.baidu.com")
  22.  
  23. text.tag_bind("a","<Enter>",show_arrow_cursor) #<Enter>是鼠标进入的样式
  24. text.tag_bind("a","<Leave>",show_xterm_cursor) #鼠标离开
  25. text.tag_bind("a","<Button-1>",click) #单击样式
  26. # def tag_bind(self, tagName, sequence, func, add=None):
  27.  
  28. master.mainloop()
  29.  
  30. SEQUENCE is a string of concatenated event
  31. patterns. An event pattern is of the form
  32. <MODIFIER-MODIFIER-TYPE-DETAIL> where MODIFIER is one
  33. of Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4,
  34. Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3,
  35. B3, Alt, Button4, B4, Double, Button5, B5 Triple,
  36. Mod1, M1. TYPE is one of Activate, Enter, Map,
  37. ButtonPress, Button, Expose, Motion, ButtonRelease
  38. FocusIn, MouseWheel, Circulate, FocusOut, Property,
  39. Colormap, Gravity Reparent, Configure, KeyPress, Key,
  40. Unmap, Deactivate, KeyRelease Visibility, Destroy,
  41. Leave and DETAIL is the button number for ButtonPress,
  42. ButtonRelease and DETAIL is the Keysym for KeyPress and
  43. KeyRelease. Examples are
  44. <Control-Button-> for pressing Control and mouse button or
  45. <Alt-A> for pressing A and the Alt key (KeyPress can be omitted).
  46. An event pattern can also be a virtual event of the form
  47. <<AString>> where AString can be arbitrary. This
  48. event can be generated by event_generate.
  49. If events are concatenated they must appear shortly
  50. after each other.
  51.  
  52. FUNC will be called if the event sequence occurs with an
  53. instance of Event as argument. If the return value of FUNC is
  54. "break" no further bound function is invoked.
  55.  
  56. An additional boolean parameter ADD specifies whether FUNC will
  57. be called additionally to the other bound function or whether
  58. it will replace the previous function.
  59.  
  60. Bind will return an identifier to allow deletion of the bound function with
  61. unbind without memory leak.
  62.  
  63. If FUNC or SEQUENCE is omitted the bound function or list
  64. of bound events are returned."""

Text的使用(tag的使用:对其绑定事件)

  1. from tkinter import *
  2. import hashlib
  3.  
  4. master = Tk()
  5.  
  6. text = Text(master,width=,height=,selectbackground="green")
  7. text.pack()
  8.  
  9. text.insert(INSERT,"gag g efwa h eshhe fawf")
  10.  
  11. contents = text.get(1.0,END)
  12.  
  13. def getData(contents):
  14. data = hashlib.md5(contents.encode())
  15. return data.hexdigest()
  16.  
  17. cont = getData(contents)
  18.  
  19. def check():
  20. data = getData(text.get(1.0,END))
  21. if data != cont:
  22. print("内容不一致")
  23. else:
  24. print("检测通过")
  25.  
  26. Button(master,text="检测",command=check).pack()
  27.  
  28. master.mainloop()

Text的使用(使用hashlib进行文本比较)


补充:使用hashlib进行文本(文件)比较


1.对于本地文件的比较:倾向于直接读取文件进行比较,毕竟hash计算也是需要读取文件内容,然后进行计算,对于两个文件,都要读取完毕,然后进行md5再进行比较。可能消耗会大于直接读取文件进行比较

2.对于网络传输文件,我们为了节省流量,最后在本地进行hash,向md5最后只需要在网络上传输32位数据即可。

推文:https://www.v2ex.com/t/257552


  1. from tkinter import *
  2. import hashlib
  3.  
  4. root = Tk()
  5.  
  6. text = Text(root,width=,height=)
  7. text.pack()
  8.  
  9. text.insert(INSERT,"fea g ag awgwag\r\n")
  10. text.insert(INSERT,"ffge g agge awgag")
  11.  
  12. def getIndex(text,index): #因为这个索引是一个小数 n.m n行m列,所以我们需要进一步处理
  13. print(text,index)
  14. return tuple(map(int,str.split(text.index(index),'.')))
  15. #map(func,iter) 这里func-->int() iter--->[n,m]可迭代
  16.  
  17. start = '1.0'
  18.  
  19. while True:
  20. pos = text.search('g',start,stopindex=END)
  21. if not pos:
  22. break
  23. print("找到位置是:",getIndex(text,pos))
  24. start = pos + "+1c"
  25.  
  26. mainloop()

Text的使用(内容查找search方法,以及map回顾)

  1. from tkinter import *
  2. import hashlib
  3.  
  4. master = Tk()
  5.  
  6. text = Text(master,width=,height=,undo=True)
  7. text.pack()
  8.  
  9. text.insert(INSERT,"gag g efwa h eshhe fawf")
  10.  
  11. def undo():
  12. text.edit_undo()
  13.  
  14. Button(master,text="撤销",command=undo).pack()
  15.  
  16. master.mainloop()

Text的使用(edit_undo进行撤销操作)(开启undo后,每一次完整的操作,都会去入栈一次,撤销就是依次出栈)

  1. 默认会在每一次完整的操作后面加上一个“分隔符”入栈。那么什么是一次完整的操作:
  2. 是指每次焦点切换(鼠标移动点击改变光标位置,后进行操作),用户按下Enter,删除\插入操作的转换等之前的操作算是一次完整的操作(对于连续相同的操作,也只能算作一次完整的操作)
  1. from tkinter import *
  2. import hashlib
  3.  
  4. master = Tk()
  5.  
  6. text = Text(master,width=,height=,undo=True,autoseparators=False)
  7. text.pack()
  8.  
  9. text.insert(INSERT,"gag g efwa h eshhe fawf")
  10.  
  11. def cusSep(*args): #每次调用该函数,就还在该位置插入一个分隔符
  12. text.edit_separator()
  13.  
  14. text.bind('<Key>',cusSep)
  15.  
  16. def undo():
  17. text.edit_undo()
  18.  
  19. Button(master,text="撤销",command=undo).pack()
  20.  
  21. master.mainloop()

Text的使用(自定义分隔符插入位置edit_separator)


Canvas:(绘图使用)


  1. from tkinter import *
  2. master = Tk()
  3.  
  4. w = Canvas(master,width=,height=) #创建绘图区域,默认在主窗口居中
  5. w.pack()
  6.  
  7. line1 = w.create_line(,,,,fill="yellow")
  8. line2 = w.create_line(,,,,fill="red",dash=(,)) #dash中元组第一个代表点划线长,第二个代表间隔长度
  9. rect1 = w.create_rectangle(,,,,fill="blue")
  10.  
  11. w.coords(line1,,,,) #坐标移动,至少4个参数,基本上就是重新绘制这条线
  12. w.delete(line2) #删除这条线
  13. w.itemconfig(rect1,fill="red") #对某一个创建的图形项目进行配置属性
  14. w.itemconfig(line1,fill="green")
  15.  
  16. Button(master,text="删除所有",command=lambda x=ALL:w.delete(x)).pack()
  17.  
  18. master.mainloop()

Canvas的使用(直线和矩形绘制和修改配置,已经删除操作)

  1. from tkinter import *
  2. master = Tk()
  3.  
  4. w = Canvas(master,width=,height=)
  5. w.pack()
  6.  
  7. w.create_line(,,,,fill="green",width=) #width是线宽
  8. w.create_line(,,,,fill="green",width=)
  9. w.create_rectangle(,,,,fill="green")
  10. w.create_rectangle(,,,,fill="yellow")
  11.  
  12. #填充文字
  13. w.create_text(,,text="fwfwaf")
  14.  
  15. master.mainloop()

Canvas的使用(create_text填写文字)

  1. from tkinter import *
  2. master = Tk()
  3.  
  4. w = Canvas(master,width=,height=)
  5. w.pack()
  6.  
  7. w.create_rectangle(,,,,fill="green",dash=(,))
  8. w.create_oval(,,,,fill="pink") #创建椭圆
  9. w.create_arc(,,,,fill="blue",width=) #创建扇形需两个点,作为两个端点
  10. w.create_polygon(,,,,,,,,fill="white") #绘制多边形,会自动封闭图形(首尾)
  11.  
  12. master.mainloop()

Canvas的使用(绘制椭圆和多边形,扇形)

  1. from tkinter import *
  2. import math
  3. master = Tk()
  4.  
  5. w = Canvas(master,width=,height=)
  6. w.pack()
  7.  
  8. center_x =
  9. center_y =
  10. r =
  11.  
  12. points = [
  13. #左上点
  14. center_x - int(r*math.sin(*math.pi/)),
  15. center_y - int(r*math.cos(*math.pi/)),
  16. #右上点
  17. center_x + int(r*math.sin(*math.pi/)),
  18. center_y - int(r*math.cos(*math.pi/)),
  19. #左下角
  20. center_x - int(r*math.sin(math.pi/)),
  21. center_y + int(r*math.cos(math.pi/)),
  22. #顶点
  23. center_x,
  24. center_y - r,
  25. #右下角
  26. center_x + int(r*math.sin(math.pi/)),
  27. center_y + int(r*math.cos(math.pi/)),
  28. ]
  29.  
  30. print(points)
  31.  
  32. w.create_polygon(points,fill="green",outline="black") #轮廓线
  33.  
  34. master.mainloop()

Canvas的使用(五角星绘制:数学math模块回顾)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. w = Canvas(master,width=,height=)
  6. w.pack()
  7.  
  8. def paint(event): #事件触发
  9. x1, y1 = (event.x-,event.y-)
  10. x2, y2 = (event.x+,event.y+)
  11. w.create_oval(x1,y1,x2,y2)
  12.  
  13. w.bind("<B1-Motion>",paint) #鼠标左键点击移动
  14. master.mainloop()

Canvas的使用(事件绑定)

  1. from tkinter import *
  2. root = Tk()
  3. # 创建一个Canvas,设置其背景色为白色
  4. cv = Canvas(root,bg = 'white')
  5. d = {:'error',:'info',:'question',:'hourglass'}
  6. for i in d:
  7. cv.create_bitmap((*i,*i),bitmap = d[i])
  8. cv.pack()
  9. root.mainloop()
  10. # 使用bitmap属性来指定位图的名称,这个函数的第一个参数为一个点(x,y)指定位图存放位置的左上位置。

Canvas的使用(create_bitmap创建)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. w = Canvas(master,width=,height=)
  6. w.pack()
  7.  
  8. img = PhotoImage(file="1.gif")
  9. w.create_image((,),image=img)
  10.  
  11. master.mainloop()

Canvas的使用(create_image图片的使用)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. w = Canvas(master,width=,height=)
  6. w.pack()
  7.  
  8. def printCanvas():
  9. print("window")
  10.  
  11. btn = Button(w,text="点我呀!",command=printCanvas)
  12.  
  13. w.create_window((,),window=btn,anchor=W)
  14.  
  15. w.create_line(,,,) #默认组件的优先级高,会覆盖重叠部分
  16.  
  17. master.mainloop()

Canvas的使用(create_window组件的使用)


推文:

Tkinter教程之Canvas篇(4)


menu:菜单使用


  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. def clb():
  6. print("dawfwa")
  7.  
  8. menubar = Menu(master)
  9. #顶级菜单的创建
  10. menubar.add_command(label="hello",command=clb)
  11. menubar.add_command(label="quit",command=master.quit)
  12.  
  13. master.config(menu=menubar)
  14.  
  15. master.mainloop()

Menu的使用(顶级菜单的创建)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. def callback():
  6. print("dawfwa")
  7.  
  8. menubar = Menu(master)
  9.  
  10. #子菜单
  11. filemenu = Menu(menubar,tearoff=False) #设置不可分离,不会在菜单界面显示一条虚线(可分离菜单窗口)
  12. filemenu.add_command(label="打开",command=callback)
  13. filemenu.add_command(label="保存",command=callback)
  14. filemenu.add_separator()
  15. filemenu.add_command(label="退出",command=master.quit)
  16.  
  17. editmenu = Menu(menubar)
  18. editmenu.add_command(label="剪切",command=callback)
  19. editmenu.add_command(label="拷贝",command=callback)
  20. editmenu.add_command(label="复制",command=callback)
  21.  
  22. #级联菜单
  23. #顶级菜单
  24. menubar.add_cascade(label="文件",menu=filemenu)
  25. menubar.add_cascade(label="编辑",menu=editmenu)
  26.  
  27. #配置后才能显示
  28. master.config(menu=menubar)
  29.  
  30. master.mainloop()

Menu的使用(级联菜单的创建:add_cascade)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. def callback():
  6. print("dawfwa")
  7.  
  8. menubar = Menu(master)
  9.  
  10. menubar.add_command(label="查询",command=callback)
  11. menubar.add_command(label="重做",command=master.quit)
  12.  
  13. frame = Frame(master,width=,height=)
  14. frame.pack()
  15.  
  16. def popup(event):
  17. menubar.post(event.x,event.y)
  18. #post是相对于整个屏幕,而不是程序窗口,而event.x/y是获取的相对于程序窗口的尺寸,所以我们需要使用event.x_root/y_root去获取屏幕尺寸
  19.  
  20. #frame是一个框架区域,其中可以包含其他控件,是一个独立的区域划分,我们在这个区域中绑定事件
  21. frame.bind("<Button-3>",popup) #-1是左键,-2是中间滑轮点击,-3是右键
  22. master.config(menu=menubar)
  23.  
  24. master.mainloop()

Menu的使用(点击弹出菜单post)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. def callback():
  6. print("dawfwa")
  7.  
  8. menubar = Menu(master)
  9.  
  10. openvar = IntVar()
  11. savevar = IntVar()
  12. quitvar = IntVar()
  13.  
  14. #子菜单
  15. filemenu = Menu(menubar,tearoff=False) #设置不可分离,不会在菜单界面显示一条虚线(可分离菜单窗口)
  16. filemenu.add_checkbutton(label="打开",command=callback,variable=openvar)
  17. filemenu.add_checkbutton(label="保存",command=callback,variable=savevar)
  18. filemenu.add_separator()
  19. filemenu.add_checkbutton(label="退出",command=master.quit,variable=quitvar)
  20.  
  21. editvar = IntVar()
  22.  
  23. editmenu = Menu(menubar)
  24. editmenu.add_radiobutton(label="剪切",command=callback,variable=editvar)
  25. editmenu.add_radiobutton(label="拷贝",command=callback,variable=editvar)
  26. editmenu.add_radiobutton(label="复制",command=callback,variable=editvar)
  27.  
  28. #级联菜单
  29. #顶级菜单
  30. menubar.add_cascade(label="文件",menu=filemenu)
  31. menubar.add_cascade(label="编辑",menu=editmenu)
  32.  
  33. master.config(menu=menubar)
  34. master.mainloop()

Menu的使用(级联菜单设置选中状态复选和单选)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. def callback():
  6. print("dawfwa")
  7.  
  8. mb = Menubutton(master,text=">",relief=RAISED)
  9. mb.pack()
  10.  
  11. filenemu = Menu(mb,tearoff=False)
  12.  
  13. #顶级菜单
  14. filenemu.add_command(label="文件",command=callback)
  15. filenemu.add_command(label="编辑",command=callback)
  16.  
  17. mb.config(menu=filenemu)
  18.  
  19. master.mainloop()

Menu的使用(Menubutton按钮菜单)


OptionMenu:实现下拉列表框(就是HTML中select)


OptionMenu的使用(下拉列表框)
  1. from tkinter import *
  2.  
  3. OPTION = [
  4. "fawf",
  5. "",
  6. "fafwa2",
  7. ]
  8.  
  9. master = Tk()
  10.  
  11. v = StringVar()
  12. v.set("one")
  13.  
  14. #def __init__(self, master, variable, value, *values, **kwargs):
  15. # w = OptionMenu(master,v,OPTION)
  16. #不加星号,进行解包,那么只能看做value被输出
  17.  
  18. #加星号,列表被序列解包,正常输出*values
  19. w = OptionMenu(master,v,*OPTION)
  20.  
  21. w.pack()
  22.  
  23. master.mainloop()

OptionMenu的使用(参数序列解包)


事件处理(事件绑定bind)


  1. <modifier-type-detail>
  2.  
  3. 事件序列是包含在<>中
  4. type部分是最重要的,他通常用于描述普通的事件类型
  5. modifier是可选的,用于描述组合键Ctrl+C,Ctrl+Shift...
  6. detail也是可选的,他通常用于描述具体的按键,<Button-> 1代表左键 中间滚轮 右键
  1. class Misc:
  2. """Internal class.
  3.  
  4. Base class which defines methods common for interior widgets."""
  5.  
  6. def bind(self, sequence=None, func=None, add=None):
  7. """Bind to this widget at event SEQUENCE a call to function FUNC.
  8.  
  9. SEQUENCE is a string of concatenated event
  10. patterns. An event pattern is of the form
  11. <MODIFIER-MODIFIER-TYPE-DETAIL> where MODIFIER is one
  12. of Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4,
  13. Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3,
  14. B3, Alt, Button4, B4, Double, Button5, B5 Triple,
  15. Mod1, M1. TYPE is one of Activate, Enter, Map,
  16. ButtonPress, Button, Expose, Motion, ButtonRelease
  17. FocusIn, MouseWheel, Circulate, FocusOut, Property,
  18. Colormap, Gravity Reparent, Configure, KeyPress, Key,
  19. Unmap, Deactivate, KeyRelease Visibility, Destroy,
  20. Leave and DETAIL is the button number for ButtonPress,
  21. ButtonRelease and DETAIL is the Keysym for KeyPress and
  22. KeyRelease. Examples are
  23. #可以进行事件组合
  24. <Control-Shift-KeyPress-H>:用户同时按下Ctrl+Shift+H才会触发
  25. <Control-Button-> for pressing Control and mouse button or
  26. <Alt-A> for pressing A and the Alt key (KeyPress can be omitted).
  27. An event pattern can also be a virtual event of the form
  28. <<AString>> where AString can be arbitrary. This
  29. event can be generated by event_generate.
  30. If events are concatenated they must appear shortly
  31. after each other.
  32.  
  33. FUNC will be called if the event sequence occurs with an
  34. instance of Event as argument. If the return value of FUNC is
  35. "break" no further bound function is invoked.
  36.  
  37. An additional boolean parameter ADD specifies whether FUNC will
  38. be called additionally to the other bound function or whether
  39. it will replace the previous function.
  40.  
  41. Bind will return an identifier to allow deletion of the bound function with
  42. unbind without memory leak.
  43.  
  44. If FUNC or SEQUENCE is omitted the bound function or list
  45. of bound events are returned."""
  46.  
  47. return self._bind(('bind', self._w), sequence, func, add)

可以绑定的事件


  1. class Event:
  2. """Container for the properties of an event.
  3.  
  4. Instances of this type are generated if one of the following events occurs:
  5.  
  6. KeyPress, KeyRelease - for keyboard events
  7. ButtonPress, ButtonRelease, Motion, Enter, Leave, MouseWheel - for mouse events
  8. Visibility, Unmap, Map, Expose, FocusIn, FocusOut, Circulate,
  9. Colormap, Gravity, Reparent, Property, Destroy, Activate,
  10. Deactivate - for window events.
  11.  
  12. If a callback function for one of these events is registered
  13. using bind, bind_all, bind_class, or tag_bind, the callback is
  14. called with an Event as first argument. It will have the
  15. following attributes (in braces are the event types for which
  16. the attribute is valid):
  17.  
  18. serial - serial number of event
  19. num - mouse button pressed (ButtonPress, ButtonRelease)
  20. focus - whether the window has the focus (Enter, Leave)
  21. height - height of the exposed window (Configure, Expose)
  22. width - width of the exposed window (Configure, Expose)
  23. keycode - keycode of the pressed key (KeyPress, KeyRelease)
  24. state - state of the event as a number (ButtonPress, ButtonRelease,
  25. Enter, KeyPress, KeyRelease,
  26. Leave, Motion)
  27. state - state as a string (Visibility)
  28. time - when the event occurred
  29. x - x-position of the mouse
  30. y - y-position of the mouse
  31. x_root - x-position of the mouse on the screen
  32. (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
  33. y_root - y-position of the mouse on the screen
  34. (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
  35. char - pressed character (KeyPress, KeyRelease)
  36. send_event - see X/Windows documentation
  37. keysym - keysym of the event as a string (KeyPress, KeyRelease)
  38. keysym_num - keysym of the event as a number (KeyPress, KeyRelease)
  39. type - type of the event as a number
  40. widget - widget in which the event occurred
  41. delta - delta of wheel movement (MouseWheel)
  42. """
  43. pass

Event事件的所有参数


  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. def callback(event):
  6. print("点击位置:",event.x,event.y)
  7.  
  8. frame = Frame(master,width=,height=)
  9. frame.pack()
  10. #绑定事件
  11. frame.bind("<Button-1>",callback) #鼠标左键
  12. frame.bind("<Button-2>",callback) #鼠标滚轮
  13. frame.bind("<Button-3>",callback) #鼠标右键
  14.  
  15. master.mainloop()

鼠标点击事件

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. def callback(event):
  6. # print("获取的键盘值:",event.keysym) #可以获取所有的键盘值,但是对于输入法输入的中文等不能识别,为??
  7. # print("获取的输入值:",event.char) #获取用户输入,对于特殊,像shift等是不能捕获,为空
  8.  
  9. char = event.char
  10. if not char:
  11. char = event.keysym
  12.  
  13. print("获取的值:",char)
  14.  
  15. frame = Frame(master,width=,height=)
  16. frame.pack()
  17. #绑定事件
  18. frame.bind("<KeyRelease>",callback) #键盘按键Key, KeyPress, KeyRelease
  19. frame.focus_set()
  20.  
  21. master.mainloop()

键盘按键消息

....其他看上面红色部分


其他组件:


  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. m = Message(master,text="fafw\ndwafawfawfawfwafawffwafaw",width=)
  6. m.pack()
  7.  
  8. master.mainloop()

Message组件(是label组件的变体:允许多行输出)

  1. from tkinter import *
  2.  
  3. master = Tk()
  4.  
  5. # sx = Spinbox(master,from_=,to=) #-
  6. # sx.pack()
  7.  
  8. sx = Spinbox(master,values=("dasf","fafw","gea"))
  9. sx.pack()
  10.  
  11. master.mainloop()

Spinbox组件(是Entry的变体:允许进行选择)

  1. #coding:utf-
  2. from tkinter import *
  3.  
  4. master = Tk()
  5.  
  6. #PanedWindow和Frame相似,都是未组件提供一个框架,不过PanedWindow允许用户调整应用程序得空间划分
  7.  
  8. pw = PanedWindow(orient=VERTICAL)
  9. pw.pack()
  10.  
  11. top = Label(pw,text="top paned")
  12.  
  13. pw.add(top)
  14.  
  15. bottom = Label(pw,text="Bottom paned")
  16.  
  17. pw.add(bottom)
  18.  
  19. master.mainloop()

PanedWindow组件(PanedWindow和Frame相似,都是未组件提供一个框架,不过PanedWindow允许用户调整应用程序得空间划分)

  1. #coding:utf-
  2. from tkinter import *
  3.  
  4. master = Tk()
  5.  
  6. #PanedWindow和Frame相似,都是未组件提供一个框架,不过PanedWindow允许用户调整应用程序得空间划分
  7.  
  8. pw1 = PanedWindow(showhandle=True,sashrelief=SUNKEN) #默认水平 showhandle显示手柄,sashrelief显示边框
  9. pw1.pack(fill=BOTH,expand=)
  10.  
  11. left = Label(pw1,text="left paned")
  12. pw1.add(left)
  13.  
  14. pw2 = PanedWindow(orient=VERTICAL,showhandle=True,sashrelief=SUNKEN)
  15.  
  16. pw1.add(pw2)
  17.  
  18. top = Label(pw2,text="top paned")
  19. bottom = Label(pw2,text="bottom paned")
  20. pw2.add(top)
  21. pw2.add(bottom)
  22.  
  23. master.mainloop()

PanedWindow组件(布局了解下)

  1. #coding:utf-
  2. from tkinter import *
  3.  
  4. master = Tk()
  5.  
  6. #Toplevel创建顶级窗口
  7.  
  8. def create():
  9. top = Toplevel()
  10. top.attributes("-alpha",0.5) #加-的原因是:最后是以命令行去调用Windows sdk alpha是透明度
  11. top.title("hello")
  12.  
  13. msg = Message(top,text="gegaegagagag\nagfawfa")
  14. msg.pack()
  15.  
  16. Button(master,text="create",command=create).pack()
  17.  
  18. master.mainloop()

Toplevel组件(创建顶级窗口)


三种标准对话框模块


  1. messagebox
  2. filedialog
  3. colorchooser

在低版本中这三个对话框放在不同的模块tkMessageBox,tkFileDialog,tkColorChooser


  1. from tkinter import *
  2. from tkinter import messagebox
  3.  
  4. master = Tk()
  5.  
  6. ret = messagebox.askokcancel("title","question")
  7. #askyesno
  8. #askretrycancel
  9. #上面返回布尔型
  10.  
  11. #showerror
  12. #showinfo
  13. #showwarning
  14. #返回OK表示按下了是
  15.  
  16. #askquestion
  17. #返回yes或者no表示点击是或否
  18.  
  19. print(ret)
  20.  
  21. master.mainloop()

messagebox对话框


  1. filedialog模块提供两个函数askopenfilenameasksaveasfilename()
  2. 分别用于打开文件和保存文件
  1. from tkinter import *
  2. from tkinter import filedialog
  3.  
  4. master = Tk()
  5.  
  6. def callback():
  7. filename = filedialog.askopenfilename(filetypes=[("PNG",".png"),("GIF",".gif"),("JPG",".jpg")])
  8. print(filename)
  9.  
  10. Button(master,text="open file",command=callback).pack()
  11.  
  12. master.mainloop()

filetypes文件类型过滤

  1. from tkinter import *
  2. from tkinter import filedialog
  3.  
  4. master = Tk()
  5.  
  6. def callback():
  7. filename = filedialog.askopenfilename(defaultextension=".png")
  8. print(filename)
  9. #defaultextension设置默认后缀,不能对文件起到过滤,只是当你选择文件未写后缀的话为你加上defaultextension,再进行筛选
  10.  
  11. Button(master,text="open file",command=callback).pack()
  12.  
  13. master.mainloop()

defaultextension设置默认后缀

  1. initialdir:设置默认打开文件夹目录
  2. title:设置标题
  3. parent:设置父窗口,默认根窗口

  1. from tkinter import *
  2. from tkinter import colorchooser
  3.  
  4. master = Tk()
  5.  
  6. def callback():
  7. color= colorchooser.askcolor()
  8. print(color)
  9. #((109.42578125, 115.44921875, 211.82421875), '#6d73d3') rgb和16进制值
  10.  
  11. Button(master,text="choose color",command=callback).pack()
  12.  
  13. master.mainloop()

colorchooser对话框


暂时完成。 还有其他工具包PyQT和PyGTK也是使用十分广泛的。

python---基础知识回顾(九)图形用户界面-------Tkinter的更多相关文章

  1. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  2. python基础知识回顾之列表

    在python 中,主要的常用数据类型有列表,元组,字典,集合,字符串.对于这些基础知识,应该要能够足够熟练掌握. 如何创建列表: # 创建一个空列表:定义一个变量,然后在等号右边放一个中括号,就创建 ...

  3. python基础教程总结11——图形用户界面GUI

    1. 丰富的平台 工具包 描述 Tkinter 使用Tk平台.很容易得到.半标准. wxpython 基于wxWindows.跨平台越来越流行. PythonWin 只能在Windows上使用.使用了 ...

  4. python基础知识回顾之字符串

    字符串是python中使用频率很高的一种数据类型,内置方法也是超级多,对于常用的方法,还是要注意掌握的. #author: Administrator #date: 2018/10/20 # pyth ...

  5. python基础知识回顾之元组

    元组与列表的方法基本一样,只不过创建元组是用小括号()把元素括起来,两者的区别在于,元组的元素不可被修改. 元组被称为只读列表,即数据可以被查询,但不能被修改,列表的切片操作适用于元组. 元组写在小括 ...

  6. python基础知识回顾[1]

    1.声明变量 # 声明一个变量name用来存储一个字符串'apollo' name = 'apollo' # 声明一个变量age用来存储一个数字20 age = 20 # 在控制台打印变量name中存 ...

  7. python基础知识小结-运维笔记

    接触python已有一段时间了,下面针对python基础知识的使用做一完整梳理:1)避免‘\n’等特殊字符的两种方式: a)利用转义字符‘\’ b)利用原始字符‘r’ print r'c:\now' ...

  8. Python 基础知识(一)

    1.Python简介 1.1.Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时 ...

  9. Python基础知识(五)

    # -*- coding: utf-8 -*-# @Time : 2018-12-25 19:31# @Author : 三斤春药# @Email : zhou_wanchun@qq.com# @Fi ...

  10. scrapy实战1,基础知识回顾和虚拟环境准备

        视频地址 https://coding.imooc.com/learn/list/92.html   一. 基础知识回顾     1. 正则表达式 1)贪婪匹配,非贪婪匹配 .*? 非贪婪 . ...

随机推荐

  1. 团队冲刺--six

    昨天: 司宇航:合并版块,但部分有缺陷. 马佳慧:研究css. 王金萱:写注册界面. 季方:  研究爬虫,精确的处理数据. 今天: 司宇航:测试功能版块,优化功能版块. 马佳慧:优化界面 . 王金萱: ...

  2. 冲刺One之站立会议6 /2015-5-19

    2015-5-19 今天把服务器端的界面完善了一下,然后大家查了好多资料,实现了登陆界面实际连接的功能,开始加了一个它和服务器的的跳转,但是分析过后发现这是个没有必要的跳转.登录应该直接转到聊天室的主 ...

  3. Java导出引用jar包的文件

    安装Eclipse打包插件Fat Jar      方案一对于含有较多第三方jar文件或含有第三方图片资源等就显得不合适,太繁琐.这时可以使用一个打包的插件-Fat Jar.      Fat Jar ...

  4. The last time the sprint(最后一个冲刺)

    经过一两个月的努力,我们终于是做出来了一点东西,从一开始接触这个项目开始,从完全不知道怎么去入手到跌跌碰碰,再到现在可以拿出来一点东西给别人看,我觉得很开心,或许我的这个成品在别人眼中并不算是什么,但 ...

  5. C# 通过http post 请求上传图片和参数

    一.C# Winform或控制台 /// <summary> /// 通过http上传图片及传参数 /// </summary> /// <param name=&quo ...

  6. PAT 1068 万绿丛中一点红

    https://pintia.cn/problem-sets/994805260223102976/problems/994805265579229184 对于计算机而言,颜色不过是像素点对应的一个 ...

  7. centos6.7 安装JDK

      1.卸载JDK 查看系统是否已安装JDK.一般的linux都默认使用了开源的openJDK.显示JDK版本信息,已经安装JDK,否则没有安装.命令行: [root@localhost ~]# ja ...

  8. java 数据结构与算法---栈

    原理来自百度百科 一.栈的定义 栈是一种只能在一端进行插入和删除操作的特殊线性表:它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数 ...

  9. java中的==操作符和equals函数

    基本规则 “==”操作符的使用需要分成两种情况 判值类型相等 这一点很好理解,两个值类型代表的数值相等,则“==”表达式返回true “==”可以用与不同值类型的比较,语言会自动进行类型转换 判引用类 ...

  10. Cent7安装mysql5.7.11全过程

    下载mysql(注:其他版本未测试) https://cdn.mysql.com/archives/mysql-5.7/mysql-boost-5.7.11.tar.gz 1.安装依赖包 yum -y ...