class ManagerUI(object): def __init__(self, top, conn): self.top = top self.conn = conn self.initComponent() self.initTable() self.quitButton = Tkinter.Button(self.top, text='退出', command=self.top.quit) self.quitButton.pack() def initComponent(self): entryWidth = 40 self.nameFm = Tkinter.Frame(self.top) self.name = Tkinter.StringVar(self.nameFm) self.nameLabel = Tkinter.Label(self.nameFm, text='姓名:') self.nameLabel.pack(side=Tkinter.LEFT) self.nameEntry = Tkinter.Entry(self.nameFm, width=entryWidth, textvariable=self.name) self.nameEntry.bind('<Return>', self.get) self.nameEntry.pack(side=Tkinter.LEFT) self.nameFm.pack() self.ageFm = Tkinter.Frame(self.top) self.age = Tkinter.StringVar(self.ageFm) self.ageLabel = Tkinter.Label(self.ageFm, text='年龄:') self.ageLabel.pack(side=Tkinter.LEFT) self.ageEntry = Tkinter.Entry(self.ageFm, width=entryWidth, textvariable=self.age) self.ageEntry.bind('<Return>', self.get) self.ageEntry.pack(side=Tkinter.LEFT) self.ageFm.pack() self.jointimeFm = Tkinter.Frame(self.top) self.jointime = Tkinter.StringVar(self.jointimeFm) self.jointimeLabel = Tkinter.Label(self.jointimeFm, text='加入时间:') self.jointimeLabel.pack(side=Tkinter.LEFT) self.jointimeEntry = Tkinter.Entry(self.jointimeFm, width=entryWidth, textvariable=self.jointime) self.jointimeEntry.bind('<Return>', self.get) self.jointimeEntry.pack(side=Tkinter.LEFT) self.jointimeFm.pack() self.btnfm = Tkinter.Frame(self.top) self.refreshButton = Tkinter.Button(self.btnfm, text='刷新', command=self.refresh) self.addButton = Tkinter.Button(self.btnfm, text='添加', command=self.add) self.getButton = Tkinter.Button(self.btnfm, text='查询', command=self.get) self.deleteButton = Tkinter.Button(self.btnfm, text='删除', command=self.delete) self.resetButton = Tkinter.Button(self.btnfm, text='重置', command=self.reset) self.refreshButton.pack(side=Tkinter.LEFT) self.addButton.pack(side=Tkinter.LEFT) self.getButton.pack(side=Tkinter.LEFT) self.deleteButton.pack(side=Tkinter.LEFT) self.resetButton.pack(side=Tkinter.LEFT) self.btnfm.pack() def initTable(self): self.tabFm = Tkinter.Frame(self.top) self.tabFm.pack(expand=True, fill=Tkinter.BOTH) # 后期修改 self.top.geometry('920x700+200+100') self.model = TableModel(rows=0, columns=0) # like HTML self.table = TableCanvas(self.tabFm, self.model, cellwidth=120, cellbackgr='#e3f698', thefont=('Arial', 12), rowheight=22, rowheaderwidth=30, rowselectedcolor='yellow', editable=False) # like CSS self.table.createTableFrame() self.colnames = ('ID', '姓名', '年龄', '加入时间') for name in self.colnames: self.table.addColumn(name) self.refresh() def refresh(self, ev=None): try: rs = self.conn.execute('select * from person') rs = rs.fetchall() self.model.deleteRows() self.table.addRows(len(rs)) self.table.redrawTable() for index, row in enumerate(rs): for i in range(len(self.colnames)): if type(row[i]) == unicode: self.model.data[index][self.colnames[i]] = ( '' + row[i]).encode('utf8') elif type(row[i]) == datetime.date: self.model.data[index][ self.colnames[i]] = row[i].strftime('%Y-%m-%d') else: # long or float self.model.data[index][self.colnames[i]] = str(row[i]) self.table.autoResizeColumns() except Exception as e: tkMessageBox.showinfo('提示', '刷新失败:%s' % e) def add(self, ev=None): try: self.conn.execute( 'INSERT INTO person(NAME, AGE, JOINTIME) values("%s", %s, "%s")' % (self.name.get().encode('utf8'), self.age.get(), self.jointime.get())) self.conn.commit() self.refresh() except Exception as e: tkMessageBox.showinfo('提示', '添加失败:%s' % e) def get(self, ev=None): try: sql = 'select * from person where 1=1' if self.name.get(): sql = sql + ' AND name like "%%%s%%"' % self.name.get() if self.age.get(): sql = sql + ' AND age = %s' % self.age.get() rs = self.conn.execute(sql) rs = rs.fetchall() self.model.deleteRows() self.table.addRows(len(rs)) self.table.redrawTable() for index, row in enumerate(rs): for i in range(len(self.colnames)): if type(row[i]) == unicode: self.model.data[index][self.colnames[i]] = ( '' + row[i]).encode('utf8') elif type(row[i]) == datetime.date: self.model.data[index][ self.colnames[i]] = row[i].strftime('%Y-%m-%d') else: # long or float self.model.data[index][self.colnames[i]] = str(row[i]) self.table.autoResizeColumns() except Exception as e: tkMessageBox.showinfo('提示', '查询失败:%s' % e) def delete(self, ev=None): try: self.get() sql = 'DELETE FROM person where 1=1' if self.name.get(): sql = sql + ' AND name like "%%%s%%"' % self.name.get() if self.age.get(): sql = sql + ' AND age = %s' % self.age.get() if tkMessageBox.askyesnocancel('提示', '确认删除表中的记录?'): self.conn.execute(sql) self.conn.commit() self.refresh() except Exception as e: tkMessageBox.showinfo('提示', '删除失败:%s' % e) def reset(self, ev=None): self.name.set('') self.age.set('') self.jointime.set('')
#by column index raw_input('Sort table by column index') table.sortTable(columnIndex=1) raw_input('Add automatic key row') #add with automatic key table.addRow() raw_input('Add row with new key name') #add with named key, other keyword arguments are interpreted as column values keyname = 'rec5' table.addRow(keyname, label='abc') raw_input('Add column') colname = 'new column' table.addColumn(colname) raw_input('Remove row') #delete rows table.deleteRow() raw_input('Put value in (2,3) cell...') row='rec4' col='col2' value=-999999.0 table.model.data[row][col] = value # for d in table.model.data: print d table.redrawTable()
class ManagerUI(object): def __init__(self, top_, manager_): self.top = top_ self.manager = manager_ self.initComponent() self.initTable() self.quitButton = Tkinter.Button(self.top, text = '退出', command = self.top.quit) self.quitButton.pack() def initComponent(self, ev = None): # 弄个列表来管理? # 注销、标签 entryWidth = 40 #这6个横着摆? self.ISBN = Tkinter.StringVar(self.top) self.ISBNEntry = Tkinter.Entry(self.top, width = entryWidth, textvariable = self.ISBN) self.ISBNEntry.bind('<Return>', self.getBook) self.ISBNEntry.pack() self.bookname = Tkinter.StringVar(self.top) self.booknameEntry = Tkinter.Entry(self.top, width = entryWidth, textvariable = self.bookname) self.booknameEntry.pack() self.authorname = Tkinter.StringVar(self.top) self.authornameEntry = Tkinter.Entry(self.top, width = entryWidth, textvariable = self.authorname) self.authornameEntry.pack() self.publisher = Tkinter.StringVar(self.top) self.publisherEntry = Tkinter.Entry(self.top, width = entryWidth, textvariable = self.publisher) self.publisherEntry.pack() self.publishtime = Tkinter.StringVar(self.top) self.publishtimeEntry = Tkinter.Entry(self.top, width = entryWidth, textvariable = self.publishtime) self.publishtimeEntry.pack() self.price = Tkinter.StringVar(self.top) self.priceEntry = Tkinter.Entry(self.top, width = entryWidth, textvariable = self.price) self.priceEntry.pack() self.bfm = Tkinter.Frame(self.top) # TODO: 按钮加图片(扁平化) self.addBookButton = Tkinter.Button(self.bfm, text = '添加', command = self.addBook) # 可选TODO:撤销刚刚进行的操作 self.getBookButton = Tkinter.Button(self.bfm, text = '获取', command = self.getBook) self.deleteButton = Tkinter.Button(self.bfm, text = '删除', command = self.deleteBook) self.clearTableButton = Tkinter.Button(self.bfm, text = '清空文本', command = self.clearTable) self.addBookButton.pack(side = Tkinter.LEFT) self.getBookButton.pack(side = Tkinter.LEFT) self.deleteButton.pack(side = Tkinter.LEFT) self.clearTableButton.pack(side = Tkinter.LEFT) self.bfm.pack() def initTable(self, ev = None): self.tableFrame = Tkinter.Frame(self.top) self.tableFrame.pack(expand = True, fill = Tkinter.BOTH) # 后期修改 self.top.geometry('920x700+200+100') self.model = TableModel(rows = 0, columns = 0) # like HTML self.bookTable = TableCanvas(self.tableFrame, self.model, cellwidth=120, cellbackgr='#e3f698', thefont=('Arial',12), rowheight=22, rowheaderwidth=30, rowselectedcolor='yellow', editable=False) # like CSS self.bookTable.createTableFrame() self.colnames = ('ISBN', '书名', '作者', '出版社', '出版时间', '价格') for name in self.colnames: self.bookTable.addColumn(name) self.bookTable.addRows(1) self.bookTable.autoResizeColumns() def addBook(self, ev = None): # TODO: 防止 SQL 注入 try: self.manager.query('insert into book values(%s,\'%s\',\'%s\',\'%s\',\'%s\',%s)' % (self.ISBN.get(), self.bookname.get().encode('utf8'), self.authorname.get().encode('utf8'), self.publisher.get().encode('utf8'), self.publishtime.get(), self.price.get())) self.manager.commit() except MySQLdb.IntegrityError, err: # TODO 已经存在此书 print u'已经存在此书'
class TelemetryPanel(observer.Observer): ''' This panel is a table of currently observed telemetry channels. ''' def __init__(self, parent, top, opt): ''' Constructor ''' self.__parent = parent self.__top = top self.__opt = opt config = ConfigManager.ConfigManager.getInstance() # Period to delay between table refreshes self.__update_period = config.get('performance', 'telem_table_update_period') # # Status updater singleton # self.__status_update = status_updater.StatusUpdater.getInstance() # # Instance the channel loader here and get all channel names # self.__channel_loader = channel_loader.ChannelLoader.getInstance() self.__channel_names_list = self.__channel_loader.getNameDict().values( ) self.__channel_names_dict = self.__channel_loader.getNameDict() num_channels = len(self.__channel_loader.getNameDict()) # # Container Frame f = Tkinter.Frame(parent) f.pack(side=Tkinter.TOP, anchor=Tkinter.N, fill=Tkinter.BOTH, expand=1) # # Create a model and connect it to a table on a canvas # self.__model = TableModel() self.__table = TableCanvas(f, model=self.__model, width=1200, height=800) # Set font font = config.get('tables', 'font') font_size = config.get('tables', 'font_size') self.__table.thefont = (font, font_size) self.__table.rowheight = int(font_size) + 5 self.__table.createTableFrame() self.__table.redrawTable() # Mouse movement causes flyover text. This is not needed. # Unbind the appropriate event handler self.__table.unbind('<Motion>') # # Init. the table with a standard set of column headers # data = {'1': {'Channel': None}} self.__model.importDict( data) # can import from a dictionary to populate model self.__table.addColumn('Id') self.__table.addColumn('Time') self.__table.addColumn('Value') for i in range(2, num_channels + 1): self.__table.addRow("%s" % i) self.__table.align = 'w' self.__table.redrawTable() self.__table.maxcellwidth = 500 # Remove Row and cell highlight color self.__table.rowselectedcolor = None self.__table.selectedcolor = None # Rebind <B1-Motion> event to catch exception from column resize error self.__table.tablecolheader.unbind('<B1-Motion') self.__table.tablecolheader.bind('<B1-Motion>', self.__handle_column_motion) self.__table.tablecolheader.unbind('<ButtonRelease-1>') self.__table.tablecolheader.bind('<ButtonRelease-1>', self.__handle_column_release) # Make table read only self.__table.editable = False # # Pop-up Channel Telemetry Filter Selection and Active Filter Status. # f2 = Tkinter.LabelFrame(f, text="Channel Telemetry Filtering:", padx=5, pady=5) f2.grid(row=2, column=0, columnspan=4, sticky=Tkinter.W + Tkinter.E) # b1 = Tkinter.Button(f2, text="Select Channels", command=self.__select) b1.pack(side=Tkinter.LEFT) # Hex value toggle self.__print_hex = Tkinter.IntVar() self.__print_hex.set(0) self.__hex_cb = Tkinter.Checkbutton(f2, text="Show Hex", variable=self.__print_hex, pady=5) self.__hex_cb.pack(side=Tkinter.RIGHT) # self.__e1 = Pmw.ScrolledField(f2, labelpos=Tkinter.W, labelmargin=0, text="None") self.__e1.pack(side=Tkinter.LEFT, expand=1, fill=Tkinter.X) self.__e1.component('entry').config(width=60) self.__e1.component('label').config(text='Active Filter Selected:') # # This is a channel id key to row value dictionary # built up over runtime to update table. # self.__row_dict = dict() self.__row_max = 1 # # List of active channels to display self.__channel_names_list.sort() self.__channels_active_list = self.__channel_names_list self.__inactive_channels = [] def __handle_column_motion(self, event): """ Used to rebind the table's ColumnHeader <B1-Motion> event. """ try: self.__table.tablecolheader.handle_mouse_drag(event) except ValueError, e: pass