python box_python msg_box

# _*_ coding: utf-8 _*_

# @Time : 2017/3/27 17:39

# @Author : otfsenter

# @File : msg_box.py

#coding:utf-8

# PyMsgBox - A simple, cross-platform, pure Python module for JavaScript-like message boxes.

# Al Sweigart al@inventwithpython.com

# Modified BSD License

# Derived from Stephen Raymond Ferg's EasyGui http://easygui.sourceforge.net/

"""

The four functions in PyMsgBox:

- alert(text='', title='', button='OK')

Displays a simple message box with text and a single OK button. Returns the text of the button clicked on.

- confirm(text='', title='', buttons=['OK', 'Cancel'])

Displays a message box with OK and Cancel buttons. Number and text of buttons can be customized. Returns the text of the button clicked on.

- prompt(text='', title='' , default='')

Displays a message box with text input, and OK & Cancel buttons. Returns the text entered, or None if Cancel was clicked.

- password(text='', title='', default='', mask='*')

Displays a message box with text input, and OK & Cancel buttons. Typed characters appear as *. Returns the text entered, or None if Cancel was clicked.

"""

"""

TODO Roadmap:

- Be able to specify a custom icon in the message box.

- Be able to place the message box at an arbitrary position (including on multi screen layouts)

- Add mouse clicks to unit testing.

- progress() function to display a progress bar

- Maybe other types of dialog: open, save, file/folder picker, etc.

"""

__version__ = '1.0.4'

import sys

RUNNING_PYTHON_2 = sys.version_info[0] == 2

if RUNNING_PYTHON_2:

import Tkinter as tk

import ttk

else:

import tkinter as tk

rootWindowPosition = '+150+100'

if tk.TkVersion < 8.0 :

raise RuntimeError('You are running Tk version: ' + str(tk.TkVersion) + 'You must be using Tk version 8.0 or greater to use PyMsgBox.')

# PROPORTIONAL_FONT_FAMILY = ('MS', 'Sans', 'Serif')

PROPORTIONAL_FONT_FAMILY = '微软雅黑'

MONOSPACE_FONT_FAMILY = ('Courier')

PROPORTIONAL_FONT_SIZE = 12

MONOSPACE_FONT_SIZE = 9 #a little smaller, because it it more legible at a smaller size

TEXT_ENTRY_FONT_SIZE = 12 # a little larger makes it easier to see

STANDARD_SELECTION_EVENTS = ['Return', 'Button-1', 'space']

# Initialize some global variables that will be reset later

__choiceboxMultipleSelect = None

__widgetTexts = None

__replyButtonText = None

__choiceboxResults = None

__firstWidget = None

__enterboxText = None

__enterboxDefaultText=''

__multenterboxText = ''

choiceboxChoices = None

choiceboxWidget = None

entryWidget = None

boxRoot = None

buttonsFrame = None

def alert(text='', title='', button='OK', root=None):

"""Displays a simple message box with text and a single OK button. Returns the text of the button clicked on."""

return _buttonbox(msg=text, title=title, choices=[str(button)], root=root)

def confirm(text='', title='', buttons=['OK', 'Cancel'], root=None):

"""Displays a message box with OK and Cancel buttons. Number and text of buttons can be customized. Returns the text of the button clicked on."""

return _buttonbox(msg=text, title=title, choices=[str(b) for b in buttons], root=root)

def prompt(text='', title='' , default='', root=None):

"""Displays a message box with text input, and OK & Cancel buttons. Returns the text entered, or None if Cancel was clicked."""

return __fillablebox(text, title, default=default, mask=None,root=root)

def password(text='', title='', default='', mask='*', root=None):

"""Displays a message box with text input, and OK & Cancel buttons. Typed characters appear as *. Returns the text entered, or None if Cancel was clicked."""

return __fillablebox(text, title, default, mask=mask, root=root)

#import pymsgbox.native as native # This needs to be after the above functions so that the unimplmeneted native functions can default back to the above functions.

#native # dummy line just to make lint stop complaining about the previous line

def _buttonbox(msg, title, choices, root=None):

"""

Display a msg, a title, and a set of buttons.

The buttons are defined by the members of the choices list.

Return the text of the button that the user selected.

@arg msg: the msg to be displayed.

@arg title: the window title

@arg choices: a list or tuple of the choices to be displayed

"""

global boxRoot, __replyButtonText, __widgetTexts, buttonsFrame

# Initialize __replyButtonText to the first choice.

# This is what will be used if the window is closed by the close button.

__replyButtonText = choices[0]

if root:

root.withdraw()

boxRoot = tk.Toplevel(master=root)

boxRoot.withdraw()

else:

boxRoot = tk.Tk()

boxRoot.withdraw()

boxRoot.title(title)

boxRoot.iconname('Dialog')

boxRoot.geometry(rootWindowPosition)

boxRoot.resizable(False, False)

boxRoot.minsize(220, 120)

# ------------- define the messageFrame ---------------------------------

messageFrame = tk.Frame(master=boxRoot)

messageFrame.pack(side=tk.TOP, fill=tk.BOTH)

# ------------- define the buttonsFrame ---------------------------------

buttonsFrame = tk.Frame(master=boxRoot)

buttonsFrame.pack(side=tk.BOTTOM, fill=tk.BOTH, pady=20)

# -------------------- place the widgets in the frames -----------------------

messageWidget = tk.Message(messageFrame, text=msg, width=400)

messageWidget.configure(font=(PROPORTIONAL_FONT_FAMILY, PROPORTIONAL_FONT_SIZE))

messageWidget.pack(side=tk.TOP, expand=tk.YES, fill=tk.X, padx='3m', pady='3m')

__put_buttons_in_buttonframe(choices)

# -------------- the action begins -----------

# put the focus on the first button

__firstWidget.focus_force()

boxRoot.deiconify()

boxRoot.mainloop()

try:

boxRoot.destroy()

except tk.TclError:

__replyButtonText = 'Cancel'

if root: root.deiconify()

return __replyButtonText

def __put_buttons_in_buttonframe(choices):

"""Put the buttons in the buttons frame"""

global __widgetTexts, __firstWidget, buttonsFrame

__firstWidget = None

__widgetTexts = {}

i = 0

for buttonText in choices:

tempButton = ttk.Button(buttonsFrame, takefocus=1, text=buttonText)

_bindArrows(tempButton)

tempButton.pack(expand=tk.YES, side=tk.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

# for the commandButton, bind activation events to the activation event handler

commandButton = tempButton

handler = __buttonEvent

for selectionEvent in STANDARD_SELECTION_EVENTS:

commandButton.bind('<%s>' % selectionEvent, handler)

if 'Cancel' in choices:

commandButton.bind('', __cancelButtonEvent)

def _bindArrows(widget, skipArrowKeys=False):

widget.bind('', _tabRight)

widget.bind('' , _tabLeft)

if not skipArrowKeys:

widget.bind('',_tabRight)

widget.bind('' , _tabLeft)

def _tabRight(event):

boxRoot.event_generate('')

def _tabLeft(event):

boxRoot.event_generate('')

def __buttonEvent(event):

"""

Handle an event that is generated by a person clicking a button.

"""

global boxRoot, __widgetTexts, __replyButtonText

__replyButtonText = __widgetTexts[event.widget]

boxRoot.quit() # quit the main loop

def __cancelButtonEvent(event):

"""Handle pressing Esc by clicking the Cancel button."""

global boxRoot, __widgetTexts, __replyButtonText

__replyButtonText = 'Cancel'

boxRoot.quit()

def __fillablebox(msg, title='', default='', mask=None, root=None):

"""

Show a box in which a user can enter some text.

You may optionally specify some default text, which will appear in the

enterbox when it is displayed.

Returns the text that the user entered, or None if he cancels the operation.

"""

global boxRoot, __enterboxText, __enterboxDefaultText

global cancelButton, entryWidget, okButton

if title == None:

title == ''

if default == None:

default = ''

__enterboxDefaultText = default

__enterboxText = __enterboxDefaultText

if root:

root.withdraw()

boxRoot = tk.Toplevel(master=root)

boxRoot.withdraw()

else:

boxRoot = tk.Tk()

boxRoot.withdraw()

boxRoot.title(title)

boxRoot.iconname('Dialog')

boxRoot.geometry(rootWindowPosition)

boxRoot.bind('', __enterboxCancel)

# ------------- define the messageFrame ---------------------------------

messageFrame = tk.Frame(master=boxRoot)

messageFrame.pack(side=tk.TOP, fill=tk.BOTH)

# ------------- define the buttonsFrame ---------------------------------

buttonsFrame = tk.Frame(master=boxRoot)

buttonsFrame.pack(side=tk.TOP, fill=tk.BOTH)

# ------------- define the entryFrame ---------------------------------

entryFrame = tk.Frame(master=boxRoot)

entryFrame.pack(side=tk.TOP, fill=tk.BOTH)

# ------------- define the buttonsFrame ---------------------------------

buttonsFrame = tk.Frame(master=boxRoot)

buttonsFrame.pack(side=tk.TOP, fill=tk.BOTH)

#-------------------- the msg widget ----------------------------

messageWidget = tk.Message(messageFrame, width='4.5i', text=msg)

messageWidget.configure(font=(PROPORTIONAL_FONT_FAMILY, PROPORTIONAL_FONT_SIZE))

messageWidget.pack(side=tk.RIGHT, expand=1, fill=tk.BOTH, padx='3m', pady='3m')

# --------- entryWidget ----------------------------------------------

entryWidget = tk.Entry(entryFrame, width=40)

_bindArrows(entryWidget, skipArrowKeys=True)

entryWidget.configure(font=(PROPORTIONAL_FONT_FAMILY, TEXT_ENTRY_FONT_SIZE))

if mask:

entryWidget.configure(show=mask)

entryWidget.pack(side=tk.LEFT, padx='3m')

entryWidget.bind('', __enterboxGetText)

entryWidget.bind('', __enterboxCancel)

# put text into the entryWidget and have it pre-highlighted

if __enterboxDefaultText != '':

entryWidget.insert(0,__enterboxDefaultText)

entryWidget.select_range(0, tk.END)

# ------------------ ok button -------------------------------

okButton = tk.Button(buttonsFrame, takefocus=1, text='OK')

_bindArrows(okButton)

okButton.pack(expand=1, side=tk.LEFT, padx='3m', pady='3m', ipadx='2m', ipady='1m')

# for the commandButton, bind activation events to the activation event handler

commandButton = okButton

handler = __enterboxGetText

for selectionEvent in STANDARD_SELECTION_EVENTS:

commandButton.bind('<%s>' % selectionEvent, handler)

# ------------------ cancel button -------------------------------

cancelButton = tk.Button(buttonsFrame, takefocus=1, text='Cancel')

_bindArrows(cancelButton)

cancelButton.pack(expand=1, side=tk.RIGHT, padx='3m', pady='3m', ipadx='2m', ipady='1m')

# for the commandButton, bind activation events to the activation event handler

commandButton = cancelButton

handler = __enterboxCancel

for selectionEvent in STANDARD_SELECTION_EVENTS:

commandButton.bind('<%s>' % selectionEvent, handler)

# ------------------- time for action! -----------------

entryWidget.focus_force() # put the focus on the entryWidget

boxRoot.deiconify()

boxRoot.mainloop() # run it!

# -------- after the run has completed ----------------------------------

if root: root.deiconify()

try:

boxRoot.destroy() # button_click didn't destroy boxRoot, so we do it now

except tk.TclError:

return None

return __enterboxText

def __enterboxGetText(event):

global __enterboxText

__enterboxText = entryWidget.get()

boxRoot.quit()

def __enterboxRestore(event):

global entryWidget

entryWidget.delete(0,len(entryWidget.get()))

entryWidget.insert(0, __enterboxDefaultText)

def __enterboxCancel(event):

global __enterboxText

__enterboxText = None

boxRoot.quit()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值