(如想转载,请联系博主或贴上本博地址)
编程,逻辑,总是让人如痴如醉。
下面进入正题。
火热的天气配上火热的python,python的入门友好性让门外汉们都看到了希望。当然自己写的程序如果没有GUI,很难让别人很好的使用,在这个基础上,学习了python的入门GUI——tk。
学习总是要学以致用,现在电脑上搜索闲鱼比较困难,就诞生这个闲鱼搜索工具,下面直接贴上代码。仅供记录学习tk之用,勿用做商业用途。(另:感谢提供界面设计思路的百度搜到的案例作者。找不到作者是谁了。)
下面贴上效果图:
有几点需要注意的地方:
①主要函数—search搜索功能
name3 = urllib.parse.quote(name,encoding='gbk')
将name搜索关键字url编码,避免搜索的关键字有转义字符。
def search(*args): try: name=str(feet.get()) vv=str(v.get()) if vv=='1': name3 = urllib.parse.quote(name,encoding='gbk') name3=name3.replace("%2B","%20") addstime='https://s.2.taobao.com/list?st_edtime=1&q='+name3+'&ist=1' adds=str(addstime) webbrowser.open(adds) #feet.set("") feet_entry.focus() return content() elif vv=='2': name3 = urllib.parse.quote(name,encoding='gbk') name3=name3.replace("%2B","%20") addsprice='https://s.2.taobao.com/list?st_price=0&q='+name3+'&ist=1' adds=str(addsprice) webbrowser.open(adds) #feet.set("") feet_entry.focus() return content() elif vv=='3': name=name.replace("+","%20") adds='https://s.2.taobao.com/list?q=' + name + '&search_type=item&_input_charset=utf8' adds=str(adds) webbrowser.open(adds) feet_entry.focus() return content() else: name=name.replace("+","%20") adds='https://s.2.taobao.com/list?q=' + name + '&search_type=item&_input_charset=utf8' adds=str(adds) webbrowser.open(adds) feet_entry.focus() return content() except ValueError: pass
②content函数功能
将scrolledtext下拉文本框作为历史记录功能并按照最新更改从上而下排序,并带有双击记录,上屏至搜索框。
def content():
#修改scr编辑状态,为可编辑
scr.config(state=NORMAL)
value = str(feet.get())
#替换多个关键字情况下可能存在的回车
value=value.replace("'\n'","")
ttk.Label(mainframe, text='').grid(column=1, row=2,sticky='W')
#以空字符替换历史文本,暂时没好办法
ttk.Label(mainframe, text=value+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" ").grid(column=1, row=2,sticky='W')
ttk.Label(mainframe, text='当前在第%d'%1+'页').grid(column=2, row=2,sticky='W')
#获取当前历史记录全部内容
oldvalue=scr.get(0.0,tk.END)
#删除当前历史记录
delvalue=scr.delete(0.0,tk.END)
#插入新记录和回车和原有记录
scr.insert(tk.INSERT,value +'\n'+oldvalue)
#改scrolledtext编辑状态为不可编辑
scr.config(state=DISABLED)
global page
page=int(1)
feet_entry.focus()
③mousejian函数
def mousejian(*args):
scr.config(state=NORMAL)
#获取鼠标指针所在行号列号
rowcol=scr.index('insert')
#获取当前光标所在行号列号
rowcolv=str(rowcol)
rowcolv=float(rowcol)
vcopy=scr.get(rowcolv,rowcolv+1)
scr.config(state=DISABLED)
#删除头尾多余的换行符
vcopy=vcopy.strip()
feet.set(vcopy)
下面贴上完整代码。
import webbrowser import re import urllib from urllib import parse from tkinter import * from tkinter import ttk import tkinter as tk from tkinter import scrolledtext from tkinter import Menu import tkinter.messagebox import tkinter as tk from tkinter import StringVar, IntVar from tkinter import Tk, Checkbutton, Label def get_screen_size(window): return window.winfo_screenwidth(),window.winfo_screenheight() def get_window_size(window): return window.winfo_reqwidth(),window.winfo_reqheight() def center_window(root, width, height): screenwidth = root.winfo_screenwidth() screenheight = root.winfo_screenheight() size = '%dx%d+%d+%d' % (width, height, (screenwidth - width)/2, (screenheight - height)/2) #print(size) root.geometry(size) def search(*args): try: name=str(feet.get()) vv=str(v.get()) if vv=='1': name3 = urllib.parse.quote(name,encoding='gbk') name3=name3.replace("%2B","%20") addstime='https://s.2.taobao.com/list?st_edtime=1&q='+name3+'&ist=1' adds=str(addstime) webbrowser.open(adds) #feet.set("") feet_entry.focus() return content() elif vv=='2': name3 = urllib.parse.quote(name,encoding='gbk') name3=name3.replace("%2B","%20") addsprice='https://s.2.taobao.com/list?st_price=0&q='+name3+'&ist=1' adds=str(addsprice) webbrowser.open(adds) #feet.set("") feet_entry.focus() return content() elif vv=='3': name=name.replace("+","%20") adds='https://s.2.taobao.com/list?q=' + name + '&search_type=item&_input_charset=utf8' adds=str(adds) webbrowser.open(adds) feet_entry.focus() return content() else: name=name.replace("+","%20") adds='https://s.2.taobao.com/list?q=' + name + '&search_type=item&_input_charset=utf8' adds=str(adds) webbrowser.open(adds) feet_entry.focus() return content() except ValueError: pass def clear(*args): try: feet.set("") scr.config(state=NORMAL) scr.delete(0.0,tk.END) scr.config(state=DISABLED) feet_entry.focus() except ValueError: pass def callback(event): return search() def content(): scr.config(state=NORMAL) value = str(feet.get()) value=value.replace("'\n'","") ttk.Label(mainframe, text='').grid(column=1, row=2,sticky='W') ttk.Label(mainframe, text=value+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" "+" ").grid(column=1, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%1+'页').grid(column=2, row=2,sticky='W') oldvalue=scr.get(0.0,tk.END) delvalue=scr.delete(0.0,tk.END) scr.insert(tk.INSERT,value +'\n'+oldvalue) scr.config(state=DISABLED) global page page=int(1) feet_entry.focus() page=int(1) def nextpage(): global page page=page+1 vv=str(v.get()) if vv=='1': if page==1: page=int(2) qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_edtime=1&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open(href,new=0,autoraise=False) else: qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_edtime=1&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open(href,new=0,autoraise=False) elif vv=='2': if page==1: page=int(2) qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_price=0&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open(href,new=0,autoraise=False) else: qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_price=0&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open(href,new=0,autoraise=False) elif vv=='3': if page==1: page=int(2) qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_trust=1&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open(href,new=0,autoraise=False) else: qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_trust=1&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open(href,new=0,autoraise=False) else: if page==1: page=int(2) qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_trust=1&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open(href,new=0,autoraise=False) else: qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_trust=1&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open(href,new=0,autoraise=False) def prepage(): global page page=page-1 vv=str(v.get()) if vv=='1': if page<1: tk.messagebox.showinfo(title='到首页了',message='已经是第一页了!') else: qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_edtime=1&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open_new(href) elif vv=='2': if page<1: tk.messagebox.showinfo(title='到首页了',message='已经是第一页了!') else: qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_price=0&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open_new(href) elif vv=='3': if page<1: tk.messagebox.showinfo(title='到首页了',message='已经是第一页了!') else: qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_trust=1&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open_new(href) else: if page<1: tk.messagebox.showinfo(title='到首页了',message='已经是第一页了!') else: qname=str(feet.get()) qname = urllib.parse.quote(qname,encoding='gbk') qname=qname.replace("%2B","%20") ttk.Label(mainframe, text='').grid(column=2, row=2,sticky='W') ttk.Label(mainframe, text='当前在第%d'%page+'页').grid(column=2, row=2,sticky='W') href='https://s.2.taobao.com/list?st_trust=1&page=%d'%(page) + '&q=' + qname + '&ist=1' href=str(href) webbrowser.open_new(href) def modified(self, event): self.txt.see(END) def mousejian(*args): scr.config(state=NORMAL) #获取鼠标指针所在行号列号 rowcol=scr.index('insert') #获取当前光标所在行号列号 rowcolv=str(rowcol) rowcolv=float(rowcol) vcopy=scr.get(rowcolv,rowcolv+1) scr.config(state=DISABLED) vcopy=vcopy.strip() feet.set(vcopy) root = Tk() root.title("剁手搜索") root.resizable(0,0) center_window(root, 320, 350) root.maxsize(int(get_screen_size(root)[0]), int(get_screen_size(root)[1])) root.minsize(320, 350) root.bind("<Key-Return>", callback) root.bind("<Double-Button-1>",mousejian) mainframe = ttk.Frame(root, padding="0 0 0 0",height=40,width=320) mainframe.grid(column=0, row=0, padx=0, pady=0,sticky=(N, W, E, S)) mainframe.columnconfigure(0, weight=1) mainframe.rowconfigure(0, weight=1) feet = StringVar() ttk.Label(mainframe, text="请输入内容:").grid(column=0, row=0,sticky='W') feet_entry = ttk.Entry(mainframe, width=18, textvariable=feet)#feet) feet_entry.grid(column=1, row=0, sticky=(W, E)) #获取当前正在搜索内容 valueD=str(feet.get()) valueD = urllib.parse.quote(valueD,encoding='gbk') valueD=valueD.replace("%2B","%20") but1=ttk.Button(mainframe, text="剁手搜索", width=10,command=search).grid(column=2, row=0,sticky='W') #createToolTip(but1,'回车快速搜索') ttk.Button(mainframe, text="清空记录", width=10,command=clear).grid(column=2, row=1,sticky='W') #selects = [('最新发布',1),('价格升序',2)] v = IntVar() #tkinter专用整型变量 v.set(3) #设置v的值为1,值多少无所谓了,我的理解是第一组写1,第二组写2,一次递增 ttk.Radiobutton(mainframe,text="最新发布",width=7,variable = v,value = 1).grid(column=0, row=1,sticky='W') #,command=RadioCall ,command=RadioCall ttk.Radiobutton(mainframe,text="价格升序",width=7,variable = v,value = 2).grid(column=1, row=1,sticky='W') ttk.Radiobutton(mainframe,text="默认",width=4,variable = v,value = 3).grid(column=1, row=1,sticky='E') ttk.Label(mainframe, text="当前正搜索:").grid(column=0, row=2,sticky='W') ttk.Button(mainframe, text="下一页", width=8,command=nextpage).grid(column=0, row=3,sticky='W') ttk.Button(mainframe, text="上一页", width=8,command=prepage).grid(column=1, row=3,sticky='W') #历史记录 scrolW = 30; scrolH = 16 scr = scrolledtext.ScrolledText(width=scrolW, height=scrolH, wrap=tk.WORD) #monty, scr.grid(column=0, row=4, sticky='WE', columnspan=3) scr.config(state=DISABLED) for child in mainframe.winfo_children(): child.grid_configure(padx=3, pady=3) feet_entry.focus() root.mainloop()