?? thinking.py
字號:
if choice == lastInserted: pass
else:
choiceboxWidget.insert(END, choice)
choiceboxChoices.append(choice)
lastInserted = choice
root.bind('<Any-Key>', KeyboardListener)
# put the buttons in the buttonsFrame
if len(choices) > 0:
okButton = Button(buttonsFrame, takefocus=YES, text="OK", height=1, width=6)
okButton.pack(expand=NO, side=TOP, padx='2m', pady='1m', ipady="1m", ipadx="2m")
okButton.bind("<Return>", __choiceboxChoice)
okButton.bind("<Button-1>",__choiceboxChoice)
# now bind the keyboard events
choiceboxWidget.bind("<Return>", __choiceboxChoice)
choiceboxWidget.bind("<Double-Button-1>", __choiceboxChoice)
else:
# now bind the keyboard events
choiceboxWidget.bind("<Return>", __choiceboxCancel)
choiceboxWidget.bind("<Double-Button-1>", __choiceboxCancel)
cancelButton = Button(buttonsFrame, takefocus=YES, text="Cancel", height=1, width=6)
cancelButton.pack(expand=NO, side=BOTTOM, padx='2m', pady='1m', ipady="1m", ipadx="2m")
cancelButton.bind("<Return>", __choiceboxCancel)
cancelButton.bind("<Button-1>", __choiceboxCancel)
# -------------------- bind some keyboard events ----------------------------
root.bind("<Escape>", __choiceboxCancel)
# --------------------- the action begins -----------------------------------
# put the focus on the choiceboxWidget, and the select highlight on the first item
choiceboxWidget.select_set(0)
choiceboxWidget.focus_force()
# --- run it! -----
root.mainloop()
if __a_button_was_clicked: root.destroy()
return __choiceboxText
def __choiceboxChoice(event):
global root, __choiceboxText, __a_button_was_clicked, choiceboxWidget
choice_index = choiceboxWidget.curselection()
__choiceboxText = choiceboxWidget.get(choice_index)
__a_button_was_clicked = 1
# print "Debugging> mouse-event=", event, " event.type=", event.type
# print "Debugging> choice =", choice_index, __choiceboxText
root.quit()
def __choiceboxCancel(event):
global root, __choiceboxText, __a_button_was_clicked
__a_button_was_clicked = 1
__choiceboxText = None
root.quit()
def KeyboardListener(event):
global choiceboxChoices, choiceboxWidget
key = event.keysym
if len(key) <= 1:
if key in string.printable:
## print key
# now find it in list.....
## before we clear the list, remember the selected member
try:
start_n = int(choiceboxWidget.curselection()[0])
except IndexError:
start_n = -1
## clear the selection.
choiceboxWidget.selection_clear(0, 'end')
## start from previous selection +1
for n in range(start_n+1, len(choiceboxChoices)):
item = choiceboxChoices[n]
if item[0].lower() == key.lower():
choiceboxWidget.selection_set(first=n)
return
else:
# has not found it so loop from top
for n in range(len(choiceboxChoices)):
item = choiceboxChoices[n]
if item[0].lower() == key.lower():
choiceboxWidget.selection_set(first = n)
## should call see method but don't have
## scrollbars in this demo!
return
# nothing matched -- we'll look for the next logical choice
for n in range(len(choiceboxChoices)):
item = choiceboxChoices[n]
if item[0].lower() > key.lower():
if n > 0:
choiceboxWidget.selection_set(first = (n-1))
else:
choiceboxWidget.selection_set(first = 0)
## should call see method but don't have
## scrollbars in this demo!
return
# still no match (nothing was greater than the key)
# we set the selection to the first item in the list
choiceboxWidget.selection_set(first = (len(choiceboxChoices)-1))
## should call see method but don't have
## scrollbars in this demo!
return
#-------------------------------------------------------------------
# codebox
#-------------------------------------------------------------------
def codebox(message="", title="", text=""):
"""
Display some text in a monospaced font, with no line wrapping.
This function is suitable for displaying code and text that is
formatted using spaces.
The text parameter should be a string, or a list or tuple of lines to be
displayed in the textbox.
"""
textbox(message, title, text, codebox=1 )
#-------------------------------------------------------------------
# textbox
#-------------------------------------------------------------------
def textbox(message="", title="", text="", codebox=0):
"""Display some text in a proportional font with line wrapping at word breaks.
This function is suitable for displaying general written text.
The text parameter should be a string, or a list or tuple of lines to be
displayed in the textbox.
"""
if message == None: message = ""
if title == None: title = ""
global root, __replyButtonText, __a_button_was_clicked, __widgetTexts, buttonsFrame
choices = ["0K"]
__replyButtonText = choices[0]
__a_button_was_clicked = 0
root = Tk()
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
root_width = int((screen_width * 0.8))
root_height = int((screen_height * 0.5))
root_xpos = int((screen_width * 0.1))
root_ypos = int((screen_height * 0.05))
root.title(title)
root.iconname('Dialog')
rootWindowPosition = "+0+0"
root.geometry(rootWindowPosition)
root.expand=NO
root.minsize(root_width, root_height)
rootWindowPosition = "+" + str(root_xpos) + "+" + str(root_ypos)
root.geometry(rootWindowPosition)
mainframe = Frame(root)
mainframe.pack(side=TOP, fill=BOTH, expand=YES)
# ---- put frames in the window -----------------------------------
# we pack the textboxFrame first, so it will expand first
textboxFrame = Frame(mainframe, borderwidth=3)
textboxFrame.pack(side=BOTTOM , fill=BOTH, expand=YES)
message_and_buttonsFrame = Frame(mainframe)
message_and_buttonsFrame.pack(side=TOP, fill=X, expand=NO)
messageFrame = Frame(message_and_buttonsFrame)
messageFrame.pack(side=LEFT, fill=X, expand=YES)
buttonsFrame = Frame(message_and_buttonsFrame)
buttonsFrame.pack(side=RIGHT, expand=NO)
# -------------------- put widgets in the frames --------------------
# put a textbox in the top frame
if codebox:
character_width = int((root_width * 0.6) / CODEBOX_FONT_SIZE)
textbox = Text(textboxFrame,height=25,width=character_width, padx="2m", pady="1m")
textbox.configure(wrap=NONE)
textbox.configure(font=(MONOSPACE_FONT_FAMILY, CODEBOX_FONT_SIZE))
else:
character_width = int((root_width * 0.6) / SMALL_FONT_SIZE)
textbox = Text(
textboxFrame
, height=25
,width=character_width
, padx="2m"
, pady="1m"
)
textbox.configure(wrap=WORD)
textbox.configure(font=(DEFAULT_FONT_FAMILY,TEXTBOX_FONT_SIZE))
# add a vertical scrollbar to the frame
rightScrollbar = Scrollbar(textboxFrame, orient=VERTICAL, command=textbox.yview)
textbox.configure(yscrollcommand = rightScrollbar.set)
# add a horizontal scrollbar to the frame
bottomScrollbar = Scrollbar(textboxFrame, orient=HORIZONTAL, command=textbox.xview)
textbox.configure(xscrollcommand = bottomScrollbar.set)
# pack the textbox and the scrollbars. Note that although we must define
# the textbox first, we must pack it last, so that the bottomScrollbar will
# be located properly.
# Note that we need a bottom scrollbar only for code.
# Text will be displayed with wordwrap, so we don't need to have a horizontal
# scroll for it.
if codebox:
bottomScrollbar.pack(side=BOTTOM, fill=X)
rightScrollbar.pack(side=RIGHT, fill=Y)
textbox.pack(side=LEFT, fill=BOTH, expand=YES)
# ---------- put a message widget in the message frame-------------------
messageWidget = Message(messageFrame, anchor=NW, text=message, width=int(root_width * 0.9))
messageWidget.configure(font=(DEFAULT_FONT_FAMILY,DEFAULT_FONT_SIZE))
messageWidget.pack(side=LEFT, expand=YES, fill=BOTH, padx='1m', pady='1m')
# put the buttons in the buttonsFrame
okButton = Button(buttonsFrame, takefocus=YES, text="OK", height=1, width=6)
okButton.pack(expand=NO, side=TOP, padx='2m', pady='1m', ipady="1m", ipadx="2m")
okButton.bind("<Return>", __textboxOK)
okButton.bind("<Button-1>",__textboxOK)
# ----------------- the action begins ----------------------------------------
try:
# load the text into the textbox
if type(text) == type("abc"): pass
else:
try:
text = "".join(text) # convert a list or a tuple to a string
except:
msgbox("Exception when trying to convert "+ str(type(text)) + " to text in textbox")
sys.exit(16)
textbox.insert(END,text, "normal")
# disable the textbox, so the text cannot be edited
textbox.configure(state=DISABLED)
except:
msgbox("Exception when trying to load the textbox.")
sys.exit(16)
try:
okButton.focus_force()
except:
msgbox("Exception when trying to put focus on okButton.")
sys.exit(16)
root.mainloop()
if __a_button_was_clicked: root.destroy()
return __replyButtonText
def __textboxOK(event):
global root, __a_button_was_clicked
__a_button_was_clicked = 1
root.quit()
#-------------------------------------------------------------------
# diropenbox
#-------------------------------------------------------------------
def diropenbox(msg=None, title=None, startpos=None):
"""A dialog to get a directory name.
Returns the name of a directory, or None if user chose to cancel.
"""
root = Tk()
root.withdraw()
f = tkFileDialog.askdirectory(parent=root, title=title)
if f == "": return None
return f
#-------------------------------------------------------------------
# fileopenbox
#-------------------------------------------------------------------
def fileopenbox(msg=None, title=None, startpos=None):
"""A dialog to get a file name.
Returns the name of a file, or None if user chose to cancel.
"""
root = Tk()
root.withdraw()
f = tkFileDialog.askopenfilename(parent=root,title=title)
if f == "": return None
return f
#-------------------------------------------------------------------
# filesavebox
#-------------------------------------------------------------------
def filesavebox(msg=None, title=None, startpos=None):
"""A file to get the name of a file to save.
Returns the name of a file, or None if user chose to cancel.
"""
root = Tk()
root.withdraw()
f = tkFileDialog.asksaveasfilename(parent=root, title=title)
if f == "": return None
return f
#-------------------------------------------------------------------
# utility routines
#-------------------------------------------------------------------
# These routines are used by several other functions in the EasyGui module.
def __buttonEvent(event):
"""Handle an event that is generated by a person clicking a button.
"""
global root, __a_button_was_clicked, __widgetTexts, __replyButtonText
__replyButtonText = __widgetTexts[event.widget]
__a_button_was_clicked = 1
root.quit() # quit the main loop
def __put_buttons_in_buttonframe(choices):
"""Put the buttons in the buttons frame
"""
global __widgetTexts, __firstWidget, buttonsFrame
__widgetTexts = {}
i = 0
for buttonText in choices:
tempButton = Button(buttonsFrame, takefocus=1, text=buttonText)
tempButton.pack(expand=YES, side=LEFT, padx='1m', pady='1m', ipadx='2m', ipady='1m')
# remember the text associated with this widget
__widgetTexts[tempButton] = buttonText
# remember the first widget, so we can put the focus there
if i == 0:
__firstWidget = tempButton
i = 1
# bind the keyboard events to the widget
tempButton.bind("<Return>", __buttonEvent)
tempButton.bind("<Button-1>", __buttonEvent)
def run_thinking():
choices = string.split(
"""tt000.py - introduction
tt010.py - simplest possible Tkinter program: 3 statements
tt020.py - creating a GUI object; packing; containers vs. widgets
tt030.py - creating a widget and putting it in a frame
tt035.py - using a class structure in the program
tt040.py - some other ways to define a widget
tt050.py - packing
tt060.py - event binding
tt070.py - "focus" and binding a widget to keyboard events
tt074.py - command binding
tt075.py - using event binding and command binding together
tt076.py - sharing information among event handlers
tt077.py - passing arguments to event handlers (part 1) - the problem
tt078.py - passing arguments to event handlers (part 2) - solving it with lambda
tt079.py - passing arguments to event handlers (part 3) - solving it with currying
tt080.py - widget options and pack settings
tt090.py - nesting frames
tt095.py - Window Manager methods & controlling the size of windows with the geometry option
tt100.py - pack options: side, expand, fill, anchor """, "\n")
title = "Thinking in Tkinter"
msg = "Pick the 'Thinking in Tkinter' program that you wish to view and run."
#========================================== END DEMONSTRATION DATA
while 1: # do forever
choice = choicebox(msg, title, choices)
if choice == None:
msg = "Thank you for looking at 'Thinking in Tkinter'."
msgbox(msg, title)
break
program_filename = choice.split()[0]
program_name = program_filename.split(".")[0]
f = open(program_filename, "r")
t = f.readlines()
f.close
msg2 = "Here is the text of " + program_filename \
+ "\n\nAfter you view the source code of the program, clicking the 'OK'" \
+" button will run the program."
codebox(msg2, title, t)
try:
exec "reload(" + program_name + ")"
except:
exec "import " + program_name
if __name__ == '__main__':
run_thinking()
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -