📄 example_09_x.py
字号:
from Common import *
from Tkinter import *
import time, Utils
timeDigits = [(415, 170, 'hour[:1]'), (440, 172, 'hour[1:]'),
(465, 174, '":"'), (490, 176, 'min[:1]'),
(515, 176, 'min[1:]'), (540, 174, '":"'),
(565, 172, 'sec[:1]'), (590, 170, 'sec[1:]')] # [1]
setDigits = [(185, 180, 'self.h1'), (210, 180, 'self.h2'),
(235, 180, '":"'), (260, 180, 'self.m1'),
(285, 180, 'self.m2')]
SECONDS_PER_DAY = 86400
class Machine:
def __init__(self, master):
self.root = master
self.root.title("Alien Machine")
self.root.iconname('TAHL')
self.curDigit = 0
self.h1 = 0
self.h2 = 0
self.m1 = 0
self.m2 = 0
self.digits = ['self.h1','self.h2','self.m1','self.m2']
self.inSet = FALSE
self.canvas = Canvas(self.root, width=640, height=480)
self.canvas.pack(side="top", fill=BOTH, expand='no')
self.img = PhotoImage(file='machine.gif') # [2]
self.canvas.create_image(0,0,anchor=NW, image=self.img)
self.b1 = self.canvas.create_oval(216,285, 270,340, fill="",
outline='#226644', width=3, tags='b_1')
# [3]
self.canvas.tag_bind(self.b1, "<Any-Enter>", self.mouseEnter)
self.canvas.tag_bind(self.b1, "<Any-Leave>", self.mouseLeave)
self.b2 = self.canvas.create_oval(216,355, 270,410, fill="",
outline='#772244', width=3, tags='b_2')
self.canvas.tag_bind(self.b2, "<Any-Enter>", self.mouseEnter)
self.canvas.tag_bind(self.b2, "<Any-Leave>", self.mouseLeave)
Widget.bind(self.canvas, "<1>", self.mouseDown) # [4]
self.buttonAction = { 'b_1': self.b1_action, # [5]
'b_2': self.b2_action }
def mouseDown(self, event):
# see if we're on a button. If we are, it
# gets tagged as CURRENT for by Tk. # [6]
if event.widget.find_withtag(CURRENT):
tags = self.canvas.gettags('current')
if '_' in tags[0]:
self.buttonAction[tags[0]]()
def mouseEnter(self, event):
# the CURRENT tag is applied to
# the object the cursor is over.
tags = self.canvas.gettags('current')
usetag = tags[0]
self.lastcolor = self.canvas.itemcget(usetag, 'outline')
self.canvas.itemconfig(usetag, outline=Color.HIGHLIGHT)
self.canvas.itemconfig(usetag, fill=self.lastcolor)
def mouseLeave(self, event):
tags = self.canvas.gettags('current')
usetag = tags[0]
self.canvas.itemconfig(usetag, outline=self.lastcolor)
self.canvas.itemconfig(usetag, fill="")
def b1_action(self):
if self.inSet:
value = eval(self.digits[self.curDigit])
value = value + 1
exec('%s = value' % self.digits[self.curDigit])
self.makeTime()
self.displaySet()
def b2_action(self):
if not self.inSet:
self.inSet = TRUE
self.displaySet()
self.root.after(1000, self.displayTime)
else:
self.curDigit = self.curDigit + 1
if self.curDigit > 3:
self.inSet = FALSE
self.canvas.delete('settag')
self.mouseLeave(None)
self.doCountdown()
def displaySet(self):
self.canvas.delete('settag') # [7]
for x,y, what in setDigits:
value = eval(what)
exec('self.canvas.create_text(%d,%d,text="%s",'
'font=("StingerLight", 36), '
'fill="#22AAFF", tags="settag")' % (x,y, value))
def makeTime(self):
if self.m2 > 9:
self.m1 = self.m1 + 1
self.m2 = 0
if self.m1 > 5:
self.h2 = self.h2 + 1
self.m1 = 0
if self.h2 > 3 and self.h1 == 2:
self.h2 = 0
self.h1 = 0
if self.h2 > 9:
self.h2 = 0
self.h1 = self.h1 + 1
if self.h1 > 2:
self.h1 = 0
def displayTime(self):
y,m,d,h,min,s,wday,jday,dst = time.localtime(time.time())
self.canvas.delete('timetag')
hour = str(100+h)[-2:]
min = str(100+min)[-2:]
sec = str(100+s)[-2:]
for x,y, what in timeDigits:
eval('self.canvas.create_text(%d, %d, text=%s,'
'font=("StingerLight", 36, "bold"),'
'fill="#FF6666", tags="timetag")' % (x,y, what))
self.root.after(1000, self.displayTime)
def doCountdown(self):
hhmm = '%d%d%d%d' % (self.h1, self.h2, self.m1, self.m2)
csec = Utils.hhmm_to_seconds(hhmm)
tsec = Utils.hhmm_to_seconds(Utils.get_hhmm(time.time()))
if csec > tsec:
self.seconds = (csec - tsec) - 1
else:
self.seconds = ((SECONDS_PER_DAY - tsec) + csec) - 1
self.root.after(1000, self.tick)
def tick(self):
self.canvas.delete('ticktag')
self.canvas.create_text(240, 190, text=`self.seconds`,
font=("StingerLight", 36), fill="#44FFFF",
tags="ticktag", anchor=CENTER)
self.seconds = self.seconds - 1
if self.seconds <= 0:
self.canvas.delete('ticktag')
self.canvas.create_text(240,195, text=MESSAGE,
font=("StingerLight", 30), fill="#2288FF",
tags="ticktag", anchor=CENTER)
else:
self.root.after(1000, self.tick)
######################################################################
if __name__ == '__main__':
root = Tk()
machine = Machine(root)
machine.root.mainloop()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -