python学习笔记(Tkinter编程利用Treeview实现表格自动更新)

博主今天总结这段时间抽空写的一个GUI编程项目

功能是查看本地打印机队列,可选择指定队列重新打印

直接上图

UI设计包括3个区域左上方,右上方和下方列表区域

使用网格grid方法来分配位置

下面是界面设计的代码

  1 #!/usr/bin/env python
  2 # -*- coding: utf-8 -*-
  3 
  4 from Tkinter import *
  5 from printer_pywin32 import PrinterPywin32
  6 import ttk
  7 
  8 
  9 class PrinterTkinter:
 10     def __init__(self):
 11         self.root = Tk()
 12         self.root.title("打印机监控系统")
 13 
 14         self.frame_left_top = Frame(width=400, height=200)
 15         self.frame_right_top = Frame(width=400, height=200)
 16         self.frame_center = Frame(width=800, height=400)
 17         self.frame_bottom = Frame(width=800, height=50)
 18 
 19         # 定义左上方区域
 20         self.left_top_title = Label(self.frame_left_top, text="打印状态:", font=('Arial', 25))
 21         self.left_top_title.grid(row=0, column=0, columnspan=2, sticky=NSEW, padx=50, pady=30)
 22 
 23         self.var_success = StringVar()  # 声明成功数
 24         self.var_false = StringVar()    # 声明失败数
 25 
 26         self.left_top_frame = Frame(self.frame_left_top)
 27         self.left_top_frame_left1 = Label(self.frame_left_top, text="打印成功数", font=('Arial', 20))
 28         self.left_top_frame_left2 = Label(self.frame_left_top, textvariable=self.var_success, font=('Arial', 15))
 29         self.get_success()  # 调用方法更新成功数
 30         self.left_top_frame_right1 = Label(self.frame_left_top, text="打印失败数", font=('Arial', 20))
 31         self.left_top_frame_right2 = Label(self.frame_left_top, textvariable=self.var_false, font=('Arial', 15))
 32         self.get_false()    # 调用方法更新失败数
 33         self.left_top_frame_left1.grid(row=1, column=0)
 34         self.left_top_frame_left2.grid(row=1, column=1)
 35         self.left_top_frame_right1.grid(row=2, column=0)
 36         self.left_top_frame_right2.grid(row=2, column=1)
 37 
 38         # 定义右上方区域
 39         self.var_entry = StringVar()
 40 
 41         self.right_top_title = Label(self.frame_right_top, text="重新打印的任务编号:", font=('Arial', 20))
 42         self.right_top_entry = Entry(self.frame_right_top, textvariable=self.var_entry)
 43 
 44         self.number = int
 45         self.right_top_button = Button(self.frame_right_top, text="确定", command=self.button_restart, font=('Arial', 15))
 46         self.right_top_title.grid(row=0, column=0)
 47         self.right_top_entry.grid(row=1, column=0)
 48         self.right_top_button.grid(row=2, column=0, padx=20, pady=20)
 49 
 50         # 定义中心列表区域
 51         self.tree = ttk.Treeview(self.frame_center, show="headings", height=18, columns=("a", "b", "c", "d", "e"))
 52         self.vbar = ttk.Scrollbar(self.frame_center, orient=VERTICAL, command=self.tree.yview)
 53         # 定义树形结构与滚动条
 54         self.tree.configure(yscrollcommand=self.vbar.set)
 55 
 56         # 表格的标题
 57         self.tree.column("a", width=50, anchor="center")
 58         self.tree.column("b", width=200, anchor="center")
 59         self.tree.column("c", width=200, anchor="center")
 60         self.tree.column("d", width=100, anchor="center")
 61         self.tree.column("e", width=150, anchor="center")
 62         self.tree.heading("a", text="编号")
 63         self.tree.heading("b", text="打印时间")
 64         self.tree.heading("c", text="打印名称")
 65         self.tree.heading("d", text="打印任务编号")
 66         self.tree.heading("e", text="打印状态")
 67 
 68         # 调用方法获取表格内容插入
 69         self.get_tree()
 70         self.tree.grid(row=0, column=0, sticky=NSEW)
 71         self.vbar.grid(row=0, column=1, sticky=NS)
 72 
 73         # 整体区域定位
 74         self.frame_left_top.grid(row=0, column=0, padx=2, pady=5)
 75         self.frame_right_top.grid(row=0, column=1, padx=30, pady=30)
 76         self.frame_center.grid(row=1, column=0, columnspan=2, padx=4, pady=5)
 77         self.frame_bottom.grid(row=2, column=0, columnspan=2)
 78 
 79         self.frame_left_top.grid_propagate(0)
 80         self.frame_right_top.grid_propagate(0)
 81         self.frame_center.grid_propagate(0)
 82         self.frame_bottom.grid_propagate(0)
 83 
 84         self.root.mainloop()
 85 
 86     # 得到打印成功数
 87     def get_success(self):
 88         self.var_success.set(PrinterPywin32.get_success())
 89         self.left_top_frame_left2.after(500, self.get_success)
 90 
 91     # 得到打印失败数
 92     def get_false(self):
 93         self.var_false.set(PrinterPywin32.get_false())
 94         self.left_top_frame.after(500, self.get_false)
 95 
 96     # 表格内容插入
 97     def get_tree(self):
 98         # 删除原节点
 99         for _ in map(self.tree.delete, self.tree.get_children("")):
100             pass
101         # 更新插入新节点
102         for i in range(len(PrinterPywin32.get_enumjobs())):
103             self.tree.insert("", "end", values=(i + 1, PrinterPywin32.get_enumjobs()[i]["Submitted"],
104                                                 PrinterPywin32.get_enumjobs()[i]["pPrinterName"],
105                                                 PrinterPywin32.get_enumjobs()[i]["JobId"],
106                                                 PrinterPywin32.get_enumjobs()[i]["Status"]))
107         self.tree.after(500, self.get_tree)
108 
109     # 重新打印
110     def button_restart(self):
111         self.number = self.right_top_entry.get()
112         PrinterPywin32.printer_restart(self.number)
113 
114 
115 if __name__ == '__main__':
116     PrinterTkinter()

这里实现了Label控件标题文字的定时更新与表格内容的自动更新

 

posted on 2016-08-16 14:43  堕落的伊丝莉  阅读(25970)  评论(5编辑  收藏  举报