fix
This commit is contained in:
4644
.CondaPkg/env/Lib/tkinter/__init__.py
vendored
4644
.CondaPkg/env/Lib/tkinter/__init__.py
vendored
File diff suppressed because it is too large
Load Diff
7
.CondaPkg/env/Lib/tkinter/__main__.py
vendored
7
.CondaPkg/env/Lib/tkinter/__main__.py
vendored
@@ -1,7 +0,0 @@
|
||||
"""Main entry point"""
|
||||
|
||||
import sys
|
||||
if sys.argv[0].endswith("__main__.py"):
|
||||
sys.argv[0] = "python -m tkinter"
|
||||
from . import _test as main
|
||||
main()
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
86
.CondaPkg/env/Lib/tkinter/colorchooser.py
vendored
86
.CondaPkg/env/Lib/tkinter/colorchooser.py
vendored
@@ -1,86 +0,0 @@
|
||||
# tk common color chooser dialogue
|
||||
#
|
||||
# this module provides an interface to the native color dialogue
|
||||
# available in Tk 4.2 and newer.
|
||||
#
|
||||
# written by Fredrik Lundh, May 1997
|
||||
#
|
||||
# fixed initialcolor handling in August 1998
|
||||
#
|
||||
|
||||
|
||||
from tkinter.commondialog import Dialog
|
||||
|
||||
__all__ = ["Chooser", "askcolor"]
|
||||
|
||||
|
||||
class Chooser(Dialog):
|
||||
"""Create a dialog for the tk_chooseColor command.
|
||||
|
||||
Args:
|
||||
master: The master widget for this dialog. If not provided,
|
||||
defaults to options['parent'] (if defined).
|
||||
options: Dictionary of options for the tk_chooseColor call.
|
||||
initialcolor: Specifies the selected color when the
|
||||
dialog is first displayed. This can be a tk color
|
||||
string or a 3-tuple of ints in the range (0, 255)
|
||||
for an RGB triplet.
|
||||
parent: The parent window of the color dialog. The
|
||||
color dialog is displayed on top of this.
|
||||
title: A string for the title of the dialog box.
|
||||
"""
|
||||
|
||||
command = "tk_chooseColor"
|
||||
|
||||
def _fixoptions(self):
|
||||
"""Ensure initialcolor is a tk color string.
|
||||
|
||||
Convert initialcolor from a RGB triplet to a color string.
|
||||
"""
|
||||
try:
|
||||
color = self.options["initialcolor"]
|
||||
if isinstance(color, tuple):
|
||||
# Assume an RGB triplet.
|
||||
self.options["initialcolor"] = "#%02x%02x%02x" % color
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
def _fixresult(self, widget, result):
|
||||
"""Adjust result returned from call to tk_chooseColor.
|
||||
|
||||
Return both an RGB tuple of ints in the range (0, 255) and the
|
||||
tk color string in the form #rrggbb.
|
||||
"""
|
||||
# Result can be many things: an empty tuple, an empty string, or
|
||||
# a _tkinter.Tcl_Obj, so this somewhat weird check handles that.
|
||||
if not result or not str(result):
|
||||
return None, None # canceled
|
||||
|
||||
# To simplify application code, the color chooser returns
|
||||
# an RGB tuple together with the Tk color string.
|
||||
r, g, b = widget.winfo_rgb(result)
|
||||
return (r//256, g//256, b//256), str(result)
|
||||
|
||||
|
||||
#
|
||||
# convenience stuff
|
||||
|
||||
def askcolor(color=None, **options):
|
||||
"""Display dialog window for selection of a color.
|
||||
|
||||
Convenience wrapper for the Chooser class. Displays the color
|
||||
chooser dialog with color as the initial value.
|
||||
"""
|
||||
|
||||
if color:
|
||||
options = options.copy()
|
||||
options["initialcolor"] = color
|
||||
|
||||
return Chooser(**options).show()
|
||||
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# test stuff
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("color", askcolor())
|
||||
53
.CondaPkg/env/Lib/tkinter/commondialog.py
vendored
53
.CondaPkg/env/Lib/tkinter/commondialog.py
vendored
@@ -1,53 +0,0 @@
|
||||
# base class for tk common dialogues
|
||||
#
|
||||
# this module provides a base class for accessing the common
|
||||
# dialogues available in Tk 4.2 and newer. use filedialog,
|
||||
# colorchooser, and messagebox to access the individual
|
||||
# dialogs.
|
||||
#
|
||||
# written by Fredrik Lundh, May 1997
|
||||
#
|
||||
|
||||
__all__ = ["Dialog"]
|
||||
|
||||
from tkinter import _get_temp_root, _destroy_temp_root
|
||||
|
||||
|
||||
class Dialog:
|
||||
|
||||
command = None
|
||||
|
||||
def __init__(self, master=None, **options):
|
||||
if master is None:
|
||||
master = options.get('parent')
|
||||
self.master = master
|
||||
self.options = options
|
||||
|
||||
def _fixoptions(self):
|
||||
pass # hook
|
||||
|
||||
def _fixresult(self, widget, result):
|
||||
return result # hook
|
||||
|
||||
def show(self, **options):
|
||||
|
||||
# update instance options
|
||||
for k, v in options.items():
|
||||
self.options[k] = v
|
||||
|
||||
self._fixoptions()
|
||||
|
||||
master = self.master
|
||||
if master is None:
|
||||
master = _get_temp_root()
|
||||
try:
|
||||
self._test_callback(master) # The function below is replaced for some tests.
|
||||
s = master.tk.call(self.command, *master._options(self.options))
|
||||
s = self._fixresult(master, s)
|
||||
finally:
|
||||
_destroy_temp_root(master)
|
||||
|
||||
return s
|
||||
|
||||
def _test_callback(self, master):
|
||||
pass
|
||||
110
.CondaPkg/env/Lib/tkinter/constants.py
vendored
110
.CondaPkg/env/Lib/tkinter/constants.py
vendored
@@ -1,110 +0,0 @@
|
||||
# Symbolic constants for Tk
|
||||
|
||||
# Booleans
|
||||
NO=FALSE=OFF=0
|
||||
YES=TRUE=ON=1
|
||||
|
||||
# -anchor and -sticky
|
||||
N='n'
|
||||
S='s'
|
||||
W='w'
|
||||
E='e'
|
||||
NW='nw'
|
||||
SW='sw'
|
||||
NE='ne'
|
||||
SE='se'
|
||||
NS='ns'
|
||||
EW='ew'
|
||||
NSEW='nsew'
|
||||
CENTER='center'
|
||||
|
||||
# -fill
|
||||
NONE='none'
|
||||
X='x'
|
||||
Y='y'
|
||||
BOTH='both'
|
||||
|
||||
# -side
|
||||
LEFT='left'
|
||||
TOP='top'
|
||||
RIGHT='right'
|
||||
BOTTOM='bottom'
|
||||
|
||||
# -relief
|
||||
RAISED='raised'
|
||||
SUNKEN='sunken'
|
||||
FLAT='flat'
|
||||
RIDGE='ridge'
|
||||
GROOVE='groove'
|
||||
SOLID = 'solid'
|
||||
|
||||
# -orient
|
||||
HORIZONTAL='horizontal'
|
||||
VERTICAL='vertical'
|
||||
|
||||
# -tabs
|
||||
NUMERIC='numeric'
|
||||
|
||||
# -wrap
|
||||
CHAR='char'
|
||||
WORD='word'
|
||||
|
||||
# -align
|
||||
BASELINE='baseline'
|
||||
|
||||
# -bordermode
|
||||
INSIDE='inside'
|
||||
OUTSIDE='outside'
|
||||
|
||||
# Special tags, marks and insert positions
|
||||
SEL='sel'
|
||||
SEL_FIRST='sel.first'
|
||||
SEL_LAST='sel.last'
|
||||
END='end'
|
||||
INSERT='insert'
|
||||
CURRENT='current'
|
||||
ANCHOR='anchor'
|
||||
ALL='all' # e.g. Canvas.delete(ALL)
|
||||
|
||||
# Text widget and button states
|
||||
NORMAL='normal'
|
||||
DISABLED='disabled'
|
||||
ACTIVE='active'
|
||||
# Canvas state
|
||||
HIDDEN='hidden'
|
||||
|
||||
# Menu item types
|
||||
CASCADE='cascade'
|
||||
CHECKBUTTON='checkbutton'
|
||||
COMMAND='command'
|
||||
RADIOBUTTON='radiobutton'
|
||||
SEPARATOR='separator'
|
||||
|
||||
# Selection modes for list boxes
|
||||
SINGLE='single'
|
||||
BROWSE='browse'
|
||||
MULTIPLE='multiple'
|
||||
EXTENDED='extended'
|
||||
|
||||
# Activestyle for list boxes
|
||||
# NONE='none' is also valid
|
||||
DOTBOX='dotbox'
|
||||
UNDERLINE='underline'
|
||||
|
||||
# Various canvas styles
|
||||
PIESLICE='pieslice'
|
||||
CHORD='chord'
|
||||
ARC='arc'
|
||||
FIRST='first'
|
||||
LAST='last'
|
||||
BUTT='butt'
|
||||
PROJECTING='projecting'
|
||||
ROUND='round'
|
||||
BEVEL='bevel'
|
||||
MITER='miter'
|
||||
|
||||
# Arguments to xview/yview
|
||||
MOVETO='moveto'
|
||||
SCROLL='scroll'
|
||||
UNITS='units'
|
||||
PAGES='pages'
|
||||
49
.CondaPkg/env/Lib/tkinter/dialog.py
vendored
49
.CondaPkg/env/Lib/tkinter/dialog.py
vendored
@@ -1,49 +0,0 @@
|
||||
# dialog.py -- Tkinter interface to the tk_dialog script.
|
||||
|
||||
from tkinter import _cnfmerge, Widget, TclError, Button, Pack
|
||||
|
||||
__all__ = ["Dialog"]
|
||||
|
||||
DIALOG_ICON = 'questhead'
|
||||
|
||||
|
||||
class Dialog(Widget):
|
||||
def __init__(self, master=None, cnf={}, **kw):
|
||||
cnf = _cnfmerge((cnf, kw))
|
||||
self.widgetName = '__dialog__'
|
||||
self._setup(master, cnf)
|
||||
self.num = self.tk.getint(
|
||||
self.tk.call(
|
||||
'tk_dialog', self._w,
|
||||
cnf['title'], cnf['text'],
|
||||
cnf['bitmap'], cnf['default'],
|
||||
*cnf['strings']))
|
||||
try: Widget.destroy(self)
|
||||
except TclError: pass
|
||||
|
||||
def destroy(self): pass
|
||||
|
||||
|
||||
def _test():
|
||||
d = Dialog(None, {'title': 'File Modified',
|
||||
'text':
|
||||
'File "Python.h" has been modified'
|
||||
' since the last time it was saved.'
|
||||
' Do you want to save it before'
|
||||
' exiting the application.',
|
||||
'bitmap': DIALOG_ICON,
|
||||
'default': 0,
|
||||
'strings': ('Save File',
|
||||
'Discard Changes',
|
||||
'Return to Editor')})
|
||||
print(d.num)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
t = Button(None, {'text': 'Test',
|
||||
'command': _test,
|
||||
Pack: {}})
|
||||
q = Button(None, {'text': 'Quit',
|
||||
'command': t.quit,
|
||||
Pack: {}})
|
||||
t.mainloop()
|
||||
324
.CondaPkg/env/Lib/tkinter/dnd.py
vendored
324
.CondaPkg/env/Lib/tkinter/dnd.py
vendored
@@ -1,324 +0,0 @@
|
||||
"""Drag-and-drop support for Tkinter.
|
||||
|
||||
This is very preliminary. I currently only support dnd *within* one
|
||||
application, between different windows (or within the same window).
|
||||
|
||||
I am trying to make this as generic as possible -- not dependent on
|
||||
the use of a particular widget or icon type, etc. I also hope that
|
||||
this will work with Pmw.
|
||||
|
||||
To enable an object to be dragged, you must create an event binding
|
||||
for it that starts the drag-and-drop process. Typically, you should
|
||||
bind <ButtonPress> to a callback function that you write. The function
|
||||
should call Tkdnd.dnd_start(source, event), where 'source' is the
|
||||
object to be dragged, and 'event' is the event that invoked the call
|
||||
(the argument to your callback function). Even though this is a class
|
||||
instantiation, the returned instance should not be stored -- it will
|
||||
be kept alive automatically for the duration of the drag-and-drop.
|
||||
|
||||
When a drag-and-drop is already in process for the Tk interpreter, the
|
||||
call is *ignored*; this normally averts starting multiple simultaneous
|
||||
dnd processes, e.g. because different button callbacks all
|
||||
dnd_start().
|
||||
|
||||
The object is *not* necessarily a widget -- it can be any
|
||||
application-specific object that is meaningful to potential
|
||||
drag-and-drop targets.
|
||||
|
||||
Potential drag-and-drop targets are discovered as follows. Whenever
|
||||
the mouse moves, and at the start and end of a drag-and-drop move, the
|
||||
Tk widget directly under the mouse is inspected. This is the target
|
||||
widget (not to be confused with the target object, yet to be
|
||||
determined). If there is no target widget, there is no dnd target
|
||||
object. If there is a target widget, and it has an attribute
|
||||
dnd_accept, this should be a function (or any callable object). The
|
||||
function is called as dnd_accept(source, event), where 'source' is the
|
||||
object being dragged (the object passed to dnd_start() above), and
|
||||
'event' is the most recent event object (generally a <Motion> event;
|
||||
it can also be <ButtonPress> or <ButtonRelease>). If the dnd_accept()
|
||||
function returns something other than None, this is the new dnd target
|
||||
object. If dnd_accept() returns None, or if the target widget has no
|
||||
dnd_accept attribute, the target widget's parent is considered as the
|
||||
target widget, and the search for a target object is repeated from
|
||||
there. If necessary, the search is repeated all the way up to the
|
||||
root widget. If none of the target widgets can produce a target
|
||||
object, there is no target object (the target object is None).
|
||||
|
||||
The target object thus produced, if any, is called the new target
|
||||
object. It is compared with the old target object (or None, if there
|
||||
was no old target widget). There are several cases ('source' is the
|
||||
source object, and 'event' is the most recent event object):
|
||||
|
||||
- Both the old and new target objects are None. Nothing happens.
|
||||
|
||||
- The old and new target objects are the same object. Its method
|
||||
dnd_motion(source, event) is called.
|
||||
|
||||
- The old target object was None, and the new target object is not
|
||||
None. The new target object's method dnd_enter(source, event) is
|
||||
called.
|
||||
|
||||
- The new target object is None, and the old target object is not
|
||||
None. The old target object's method dnd_leave(source, event) is
|
||||
called.
|
||||
|
||||
- The old and new target objects differ and neither is None. The old
|
||||
target object's method dnd_leave(source, event), and then the new
|
||||
target object's method dnd_enter(source, event) is called.
|
||||
|
||||
Once this is done, the new target object replaces the old one, and the
|
||||
Tk mainloop proceeds. The return value of the methods mentioned above
|
||||
is ignored; if they raise an exception, the normal exception handling
|
||||
mechanisms take over.
|
||||
|
||||
The drag-and-drop processes can end in two ways: a final target object
|
||||
is selected, or no final target object is selected. When a final
|
||||
target object is selected, it will always have been notified of the
|
||||
potential drop by a call to its dnd_enter() method, as described
|
||||
above, and possibly one or more calls to its dnd_motion() method; its
|
||||
dnd_leave() method has not been called since the last call to
|
||||
dnd_enter(). The target is notified of the drop by a call to its
|
||||
method dnd_commit(source, event).
|
||||
|
||||
If no final target object is selected, and there was an old target
|
||||
object, its dnd_leave(source, event) method is called to complete the
|
||||
dnd sequence.
|
||||
|
||||
Finally, the source object is notified that the drag-and-drop process
|
||||
is over, by a call to source.dnd_end(target, event), specifying either
|
||||
the selected target object, or None if no target object was selected.
|
||||
The source object can use this to implement the commit action; this is
|
||||
sometimes simpler than to do it in the target's dnd_commit(). The
|
||||
target's dnd_commit() method could then simply be aliased to
|
||||
dnd_leave().
|
||||
|
||||
At any time during a dnd sequence, the application can cancel the
|
||||
sequence by calling the cancel() method on the object returned by
|
||||
dnd_start(). This will call dnd_leave() if a target is currently
|
||||
active; it will never call dnd_commit().
|
||||
|
||||
"""
|
||||
|
||||
import tkinter
|
||||
|
||||
__all__ = ["dnd_start", "DndHandler"]
|
||||
|
||||
|
||||
# The factory function
|
||||
|
||||
def dnd_start(source, event):
|
||||
h = DndHandler(source, event)
|
||||
if h.root is not None:
|
||||
return h
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
# The class that does the work
|
||||
|
||||
class DndHandler:
|
||||
|
||||
root = None
|
||||
|
||||
def __init__(self, source, event):
|
||||
if event.num > 5:
|
||||
return
|
||||
root = event.widget._root()
|
||||
try:
|
||||
root.__dnd
|
||||
return # Don't start recursive dnd
|
||||
except AttributeError:
|
||||
root.__dnd = self
|
||||
self.root = root
|
||||
self.source = source
|
||||
self.target = None
|
||||
self.initial_button = button = event.num
|
||||
self.initial_widget = widget = event.widget
|
||||
self.release_pattern = "<B%d-ButtonRelease-%d>" % (button, button)
|
||||
self.save_cursor = widget['cursor'] or ""
|
||||
widget.bind(self.release_pattern, self.on_release)
|
||||
widget.bind("<Motion>", self.on_motion)
|
||||
widget['cursor'] = "hand2"
|
||||
|
||||
def __del__(self):
|
||||
root = self.root
|
||||
self.root = None
|
||||
if root is not None:
|
||||
try:
|
||||
del root.__dnd
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
def on_motion(self, event):
|
||||
x, y = event.x_root, event.y_root
|
||||
target_widget = self.initial_widget.winfo_containing(x, y)
|
||||
source = self.source
|
||||
new_target = None
|
||||
while target_widget is not None:
|
||||
try:
|
||||
attr = target_widget.dnd_accept
|
||||
except AttributeError:
|
||||
pass
|
||||
else:
|
||||
new_target = attr(source, event)
|
||||
if new_target is not None:
|
||||
break
|
||||
target_widget = target_widget.master
|
||||
old_target = self.target
|
||||
if old_target is new_target:
|
||||
if old_target is not None:
|
||||
old_target.dnd_motion(source, event)
|
||||
else:
|
||||
if old_target is not None:
|
||||
self.target = None
|
||||
old_target.dnd_leave(source, event)
|
||||
if new_target is not None:
|
||||
new_target.dnd_enter(source, event)
|
||||
self.target = new_target
|
||||
|
||||
def on_release(self, event):
|
||||
self.finish(event, 1)
|
||||
|
||||
def cancel(self, event=None):
|
||||
self.finish(event, 0)
|
||||
|
||||
def finish(self, event, commit=0):
|
||||
target = self.target
|
||||
source = self.source
|
||||
widget = self.initial_widget
|
||||
root = self.root
|
||||
try:
|
||||
del root.__dnd
|
||||
self.initial_widget.unbind(self.release_pattern)
|
||||
self.initial_widget.unbind("<Motion>")
|
||||
widget['cursor'] = self.save_cursor
|
||||
self.target = self.source = self.initial_widget = self.root = None
|
||||
if target is not None:
|
||||
if commit:
|
||||
target.dnd_commit(source, event)
|
||||
else:
|
||||
target.dnd_leave(source, event)
|
||||
finally:
|
||||
source.dnd_end(target, event)
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# The rest is here for testing and demonstration purposes only!
|
||||
|
||||
class Icon:
|
||||
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.canvas = self.label = self.id = None
|
||||
|
||||
def attach(self, canvas, x=10, y=10):
|
||||
if canvas is self.canvas:
|
||||
self.canvas.coords(self.id, x, y)
|
||||
return
|
||||
if self.canvas is not None:
|
||||
self.detach()
|
||||
if canvas is None:
|
||||
return
|
||||
label = tkinter.Label(canvas, text=self.name,
|
||||
borderwidth=2, relief="raised")
|
||||
id = canvas.create_window(x, y, window=label, anchor="nw")
|
||||
self.canvas = canvas
|
||||
self.label = label
|
||||
self.id = id
|
||||
label.bind("<ButtonPress>", self.press)
|
||||
|
||||
def detach(self):
|
||||
canvas = self.canvas
|
||||
if canvas is None:
|
||||
return
|
||||
id = self.id
|
||||
label = self.label
|
||||
self.canvas = self.label = self.id = None
|
||||
canvas.delete(id)
|
||||
label.destroy()
|
||||
|
||||
def press(self, event):
|
||||
if dnd_start(self, event):
|
||||
# where the pointer is relative to the label widget:
|
||||
self.x_off = event.x
|
||||
self.y_off = event.y
|
||||
# where the widget is relative to the canvas:
|
||||
self.x_orig, self.y_orig = self.canvas.coords(self.id)
|
||||
|
||||
def move(self, event):
|
||||
x, y = self.where(self.canvas, event)
|
||||
self.canvas.coords(self.id, x, y)
|
||||
|
||||
def putback(self):
|
||||
self.canvas.coords(self.id, self.x_orig, self.y_orig)
|
||||
|
||||
def where(self, canvas, event):
|
||||
# where the corner of the canvas is relative to the screen:
|
||||
x_org = canvas.winfo_rootx()
|
||||
y_org = canvas.winfo_rooty()
|
||||
# where the pointer is relative to the canvas widget:
|
||||
x = event.x_root - x_org
|
||||
y = event.y_root - y_org
|
||||
# compensate for initial pointer offset
|
||||
return x - self.x_off, y - self.y_off
|
||||
|
||||
def dnd_end(self, target, event):
|
||||
pass
|
||||
|
||||
|
||||
class Tester:
|
||||
|
||||
def __init__(self, root):
|
||||
self.top = tkinter.Toplevel(root)
|
||||
self.canvas = tkinter.Canvas(self.top, width=100, height=100)
|
||||
self.canvas.pack(fill="both", expand=1)
|
||||
self.canvas.dnd_accept = self.dnd_accept
|
||||
|
||||
def dnd_accept(self, source, event):
|
||||
return self
|
||||
|
||||
def dnd_enter(self, source, event):
|
||||
self.canvas.focus_set() # Show highlight border
|
||||
x, y = source.where(self.canvas, event)
|
||||
x1, y1, x2, y2 = source.canvas.bbox(source.id)
|
||||
dx, dy = x2-x1, y2-y1
|
||||
self.dndid = self.canvas.create_rectangle(x, y, x+dx, y+dy)
|
||||
self.dnd_motion(source, event)
|
||||
|
||||
def dnd_motion(self, source, event):
|
||||
x, y = source.where(self.canvas, event)
|
||||
x1, y1, x2, y2 = self.canvas.bbox(self.dndid)
|
||||
self.canvas.move(self.dndid, x-x1, y-y1)
|
||||
|
||||
def dnd_leave(self, source, event):
|
||||
self.top.focus_set() # Hide highlight border
|
||||
self.canvas.delete(self.dndid)
|
||||
self.dndid = None
|
||||
|
||||
def dnd_commit(self, source, event):
|
||||
self.dnd_leave(source, event)
|
||||
x, y = source.where(self.canvas, event)
|
||||
source.attach(self.canvas, x, y)
|
||||
|
||||
|
||||
def test():
|
||||
root = tkinter.Tk()
|
||||
root.geometry("+1+1")
|
||||
tkinter.Button(command=root.quit, text="Quit").pack()
|
||||
t1 = Tester(root)
|
||||
t1.top.geometry("+1+60")
|
||||
t2 = Tester(root)
|
||||
t2.top.geometry("+120+60")
|
||||
t3 = Tester(root)
|
||||
t3.top.geometry("+240+60")
|
||||
i1 = Icon("ICON1")
|
||||
i2 = Icon("ICON2")
|
||||
i3 = Icon("ICON3")
|
||||
i1.attach(t1.canvas)
|
||||
i2.attach(t2.canvas)
|
||||
i3.attach(t3.canvas)
|
||||
root.mainloop()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
test()
|
||||
492
.CondaPkg/env/Lib/tkinter/filedialog.py
vendored
492
.CondaPkg/env/Lib/tkinter/filedialog.py
vendored
@@ -1,492 +0,0 @@
|
||||
"""File selection dialog classes.
|
||||
|
||||
Classes:
|
||||
|
||||
- FileDialog
|
||||
- LoadFileDialog
|
||||
- SaveFileDialog
|
||||
|
||||
This module also presents tk common file dialogues, it provides interfaces
|
||||
to the native file dialogues available in Tk 4.2 and newer, and the
|
||||
directory dialogue available in Tk 8.3 and newer.
|
||||
These interfaces were written by Fredrik Lundh, May 1997.
|
||||
"""
|
||||
__all__ = ["FileDialog", "LoadFileDialog", "SaveFileDialog",
|
||||
"Open", "SaveAs", "Directory",
|
||||
"askopenfilename", "asksaveasfilename", "askopenfilenames",
|
||||
"askopenfile", "askopenfiles", "asksaveasfile", "askdirectory"]
|
||||
|
||||
import fnmatch
|
||||
import os
|
||||
from tkinter import (
|
||||
Frame, LEFT, YES, BOTTOM, Entry, TOP, Button, Tk, X,
|
||||
Toplevel, RIGHT, Y, END, Listbox, BOTH, Scrollbar,
|
||||
)
|
||||
from tkinter.dialog import Dialog
|
||||
from tkinter import commondialog
|
||||
from tkinter.simpledialog import _setup_dialog
|
||||
|
||||
|
||||
dialogstates = {}
|
||||
|
||||
|
||||
class FileDialog:
|
||||
|
||||
"""Standard file selection dialog -- no checks on selected file.
|
||||
|
||||
Usage:
|
||||
|
||||
d = FileDialog(master)
|
||||
fname = d.go(dir_or_file, pattern, default, key)
|
||||
if fname is None: ...canceled...
|
||||
else: ...open file...
|
||||
|
||||
All arguments to go() are optional.
|
||||
|
||||
The 'key' argument specifies a key in the global dictionary
|
||||
'dialogstates', which keeps track of the values for the directory
|
||||
and pattern arguments, overriding the values passed in (it does
|
||||
not keep track of the default argument!). If no key is specified,
|
||||
the dialog keeps no memory of previous state. Note that memory is
|
||||
kept even when the dialog is canceled. (All this emulates the
|
||||
behavior of the Macintosh file selection dialogs.)
|
||||
|
||||
"""
|
||||
|
||||
title = "File Selection Dialog"
|
||||
|
||||
def __init__(self, master, title=None):
|
||||
if title is None: title = self.title
|
||||
self.master = master
|
||||
self.directory = None
|
||||
|
||||
self.top = Toplevel(master)
|
||||
self.top.title(title)
|
||||
self.top.iconname(title)
|
||||
_setup_dialog(self.top)
|
||||
|
||||
self.botframe = Frame(self.top)
|
||||
self.botframe.pack(side=BOTTOM, fill=X)
|
||||
|
||||
self.selection = Entry(self.top)
|
||||
self.selection.pack(side=BOTTOM, fill=X)
|
||||
self.selection.bind('<Return>', self.ok_event)
|
||||
|
||||
self.filter = Entry(self.top)
|
||||
self.filter.pack(side=TOP, fill=X)
|
||||
self.filter.bind('<Return>', self.filter_command)
|
||||
|
||||
self.midframe = Frame(self.top)
|
||||
self.midframe.pack(expand=YES, fill=BOTH)
|
||||
|
||||
self.filesbar = Scrollbar(self.midframe)
|
||||
self.filesbar.pack(side=RIGHT, fill=Y)
|
||||
self.files = Listbox(self.midframe, exportselection=0,
|
||||
yscrollcommand=(self.filesbar, 'set'))
|
||||
self.files.pack(side=RIGHT, expand=YES, fill=BOTH)
|
||||
btags = self.files.bindtags()
|
||||
self.files.bindtags(btags[1:] + btags[:1])
|
||||
self.files.bind('<ButtonRelease-1>', self.files_select_event)
|
||||
self.files.bind('<Double-ButtonRelease-1>', self.files_double_event)
|
||||
self.filesbar.config(command=(self.files, 'yview'))
|
||||
|
||||
self.dirsbar = Scrollbar(self.midframe)
|
||||
self.dirsbar.pack(side=LEFT, fill=Y)
|
||||
self.dirs = Listbox(self.midframe, exportselection=0,
|
||||
yscrollcommand=(self.dirsbar, 'set'))
|
||||
self.dirs.pack(side=LEFT, expand=YES, fill=BOTH)
|
||||
self.dirsbar.config(command=(self.dirs, 'yview'))
|
||||
btags = self.dirs.bindtags()
|
||||
self.dirs.bindtags(btags[1:] + btags[:1])
|
||||
self.dirs.bind('<ButtonRelease-1>', self.dirs_select_event)
|
||||
self.dirs.bind('<Double-ButtonRelease-1>', self.dirs_double_event)
|
||||
|
||||
self.ok_button = Button(self.botframe,
|
||||
text="OK",
|
||||
command=self.ok_command)
|
||||
self.ok_button.pack(side=LEFT)
|
||||
self.filter_button = Button(self.botframe,
|
||||
text="Filter",
|
||||
command=self.filter_command)
|
||||
self.filter_button.pack(side=LEFT, expand=YES)
|
||||
self.cancel_button = Button(self.botframe,
|
||||
text="Cancel",
|
||||
command=self.cancel_command)
|
||||
self.cancel_button.pack(side=RIGHT)
|
||||
|
||||
self.top.protocol('WM_DELETE_WINDOW', self.cancel_command)
|
||||
# XXX Are the following okay for a general audience?
|
||||
self.top.bind('<Alt-w>', self.cancel_command)
|
||||
self.top.bind('<Alt-W>', self.cancel_command)
|
||||
|
||||
def go(self, dir_or_file=os.curdir, pattern="*", default="", key=None):
|
||||
if key and key in dialogstates:
|
||||
self.directory, pattern = dialogstates[key]
|
||||
else:
|
||||
dir_or_file = os.path.expanduser(dir_or_file)
|
||||
if os.path.isdir(dir_or_file):
|
||||
self.directory = dir_or_file
|
||||
else:
|
||||
self.directory, default = os.path.split(dir_or_file)
|
||||
self.set_filter(self.directory, pattern)
|
||||
self.set_selection(default)
|
||||
self.filter_command()
|
||||
self.selection.focus_set()
|
||||
self.top.wait_visibility() # window needs to be visible for the grab
|
||||
self.top.grab_set()
|
||||
self.how = None
|
||||
self.master.mainloop() # Exited by self.quit(how)
|
||||
if key:
|
||||
directory, pattern = self.get_filter()
|
||||
if self.how:
|
||||
directory = os.path.dirname(self.how)
|
||||
dialogstates[key] = directory, pattern
|
||||
self.top.destroy()
|
||||
return self.how
|
||||
|
||||
def quit(self, how=None):
|
||||
self.how = how
|
||||
self.master.quit() # Exit mainloop()
|
||||
|
||||
def dirs_double_event(self, event):
|
||||
self.filter_command()
|
||||
|
||||
def dirs_select_event(self, event):
|
||||
dir, pat = self.get_filter()
|
||||
subdir = self.dirs.get('active')
|
||||
dir = os.path.normpath(os.path.join(self.directory, subdir))
|
||||
self.set_filter(dir, pat)
|
||||
|
||||
def files_double_event(self, event):
|
||||
self.ok_command()
|
||||
|
||||
def files_select_event(self, event):
|
||||
file = self.files.get('active')
|
||||
self.set_selection(file)
|
||||
|
||||
def ok_event(self, event):
|
||||
self.ok_command()
|
||||
|
||||
def ok_command(self):
|
||||
self.quit(self.get_selection())
|
||||
|
||||
def filter_command(self, event=None):
|
||||
dir, pat = self.get_filter()
|
||||
try:
|
||||
names = os.listdir(dir)
|
||||
except OSError:
|
||||
self.master.bell()
|
||||
return
|
||||
self.directory = dir
|
||||
self.set_filter(dir, pat)
|
||||
names.sort()
|
||||
subdirs = [os.pardir]
|
||||
matchingfiles = []
|
||||
for name in names:
|
||||
fullname = os.path.join(dir, name)
|
||||
if os.path.isdir(fullname):
|
||||
subdirs.append(name)
|
||||
elif fnmatch.fnmatch(name, pat):
|
||||
matchingfiles.append(name)
|
||||
self.dirs.delete(0, END)
|
||||
for name in subdirs:
|
||||
self.dirs.insert(END, name)
|
||||
self.files.delete(0, END)
|
||||
for name in matchingfiles:
|
||||
self.files.insert(END, name)
|
||||
head, tail = os.path.split(self.get_selection())
|
||||
if tail == os.curdir: tail = ''
|
||||
self.set_selection(tail)
|
||||
|
||||
def get_filter(self):
|
||||
filter = self.filter.get()
|
||||
filter = os.path.expanduser(filter)
|
||||
if filter[-1:] == os.sep or os.path.isdir(filter):
|
||||
filter = os.path.join(filter, "*")
|
||||
return os.path.split(filter)
|
||||
|
||||
def get_selection(self):
|
||||
file = self.selection.get()
|
||||
file = os.path.expanduser(file)
|
||||
return file
|
||||
|
||||
def cancel_command(self, event=None):
|
||||
self.quit()
|
||||
|
||||
def set_filter(self, dir, pat):
|
||||
if not os.path.isabs(dir):
|
||||
try:
|
||||
pwd = os.getcwd()
|
||||
except OSError:
|
||||
pwd = None
|
||||
if pwd:
|
||||
dir = os.path.join(pwd, dir)
|
||||
dir = os.path.normpath(dir)
|
||||
self.filter.delete(0, END)
|
||||
self.filter.insert(END, os.path.join(dir or os.curdir, pat or "*"))
|
||||
|
||||
def set_selection(self, file):
|
||||
self.selection.delete(0, END)
|
||||
self.selection.insert(END, os.path.join(self.directory, file))
|
||||
|
||||
|
||||
class LoadFileDialog(FileDialog):
|
||||
|
||||
"""File selection dialog which checks that the file exists."""
|
||||
|
||||
title = "Load File Selection Dialog"
|
||||
|
||||
def ok_command(self):
|
||||
file = self.get_selection()
|
||||
if not os.path.isfile(file):
|
||||
self.master.bell()
|
||||
else:
|
||||
self.quit(file)
|
||||
|
||||
|
||||
class SaveFileDialog(FileDialog):
|
||||
|
||||
"""File selection dialog which checks that the file may be created."""
|
||||
|
||||
title = "Save File Selection Dialog"
|
||||
|
||||
def ok_command(self):
|
||||
file = self.get_selection()
|
||||
if os.path.exists(file):
|
||||
if os.path.isdir(file):
|
||||
self.master.bell()
|
||||
return
|
||||
d = Dialog(self.top,
|
||||
title="Overwrite Existing File Question",
|
||||
text="Overwrite existing file %r?" % (file,),
|
||||
bitmap='questhead',
|
||||
default=1,
|
||||
strings=("Yes", "Cancel"))
|
||||
if d.num != 0:
|
||||
return
|
||||
else:
|
||||
head, tail = os.path.split(file)
|
||||
if not os.path.isdir(head):
|
||||
self.master.bell()
|
||||
return
|
||||
self.quit(file)
|
||||
|
||||
|
||||
# For the following classes and modules:
|
||||
#
|
||||
# options (all have default values):
|
||||
#
|
||||
# - defaultextension: added to filename if not explicitly given
|
||||
#
|
||||
# - filetypes: sequence of (label, pattern) tuples. the same pattern
|
||||
# may occur with several patterns. use "*" as pattern to indicate
|
||||
# all files.
|
||||
#
|
||||
# - initialdir: initial directory. preserved by dialog instance.
|
||||
#
|
||||
# - initialfile: initial file (ignored by the open dialog). preserved
|
||||
# by dialog instance.
|
||||
#
|
||||
# - parent: which window to place the dialog on top of
|
||||
#
|
||||
# - title: dialog title
|
||||
#
|
||||
# - multiple: if true user may select more than one file
|
||||
#
|
||||
# options for the directory chooser:
|
||||
#
|
||||
# - initialdir, parent, title: see above
|
||||
#
|
||||
# - mustexist: if true, user must pick an existing directory
|
||||
#
|
||||
|
||||
|
||||
class _Dialog(commondialog.Dialog):
|
||||
|
||||
def _fixoptions(self):
|
||||
try:
|
||||
# make sure "filetypes" is a tuple
|
||||
self.options["filetypes"] = tuple(self.options["filetypes"])
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
def _fixresult(self, widget, result):
|
||||
if result:
|
||||
# keep directory and filename until next time
|
||||
# convert Tcl path objects to strings
|
||||
try:
|
||||
result = result.string
|
||||
except AttributeError:
|
||||
# it already is a string
|
||||
pass
|
||||
path, file = os.path.split(result)
|
||||
self.options["initialdir"] = path
|
||||
self.options["initialfile"] = file
|
||||
self.filename = result # compatibility
|
||||
return result
|
||||
|
||||
|
||||
#
|
||||
# file dialogs
|
||||
|
||||
class Open(_Dialog):
|
||||
"Ask for a filename to open"
|
||||
|
||||
command = "tk_getOpenFile"
|
||||
|
||||
def _fixresult(self, widget, result):
|
||||
if isinstance(result, tuple):
|
||||
# multiple results:
|
||||
result = tuple([getattr(r, "string", r) for r in result])
|
||||
if result:
|
||||
path, file = os.path.split(result[0])
|
||||
self.options["initialdir"] = path
|
||||
# don't set initialfile or filename, as we have multiple of these
|
||||
return result
|
||||
if not widget.tk.wantobjects() and "multiple" in self.options:
|
||||
# Need to split result explicitly
|
||||
return self._fixresult(widget, widget.tk.splitlist(result))
|
||||
return _Dialog._fixresult(self, widget, result)
|
||||
|
||||
|
||||
class SaveAs(_Dialog):
|
||||
"Ask for a filename to save as"
|
||||
|
||||
command = "tk_getSaveFile"
|
||||
|
||||
|
||||
# the directory dialog has its own _fix routines.
|
||||
class Directory(commondialog.Dialog):
|
||||
"Ask for a directory"
|
||||
|
||||
command = "tk_chooseDirectory"
|
||||
|
||||
def _fixresult(self, widget, result):
|
||||
if result:
|
||||
# convert Tcl path objects to strings
|
||||
try:
|
||||
result = result.string
|
||||
except AttributeError:
|
||||
# it already is a string
|
||||
pass
|
||||
# keep directory until next time
|
||||
self.options["initialdir"] = result
|
||||
self.directory = result # compatibility
|
||||
return result
|
||||
|
||||
#
|
||||
# convenience stuff
|
||||
|
||||
|
||||
def askopenfilename(**options):
|
||||
"Ask for a filename to open"
|
||||
|
||||
return Open(**options).show()
|
||||
|
||||
|
||||
def asksaveasfilename(**options):
|
||||
"Ask for a filename to save as"
|
||||
|
||||
return SaveAs(**options).show()
|
||||
|
||||
|
||||
def askopenfilenames(**options):
|
||||
"""Ask for multiple filenames to open
|
||||
|
||||
Returns a list of filenames or empty list if
|
||||
cancel button selected
|
||||
"""
|
||||
options["multiple"]=1
|
||||
return Open(**options).show()
|
||||
|
||||
# FIXME: are the following perhaps a bit too convenient?
|
||||
|
||||
|
||||
def askopenfile(mode = "r", **options):
|
||||
"Ask for a filename to open, and returned the opened file"
|
||||
|
||||
filename = Open(**options).show()
|
||||
if filename:
|
||||
return open(filename, mode)
|
||||
return None
|
||||
|
||||
|
||||
def askopenfiles(mode = "r", **options):
|
||||
"""Ask for multiple filenames and return the open file
|
||||
objects
|
||||
|
||||
returns a list of open file objects or an empty list if
|
||||
cancel selected
|
||||
"""
|
||||
|
||||
files = askopenfilenames(**options)
|
||||
if files:
|
||||
ofiles=[]
|
||||
for filename in files:
|
||||
ofiles.append(open(filename, mode))
|
||||
files=ofiles
|
||||
return files
|
||||
|
||||
|
||||
def asksaveasfile(mode = "w", **options):
|
||||
"Ask for a filename to save as, and returned the opened file"
|
||||
|
||||
filename = SaveAs(**options).show()
|
||||
if filename:
|
||||
return open(filename, mode)
|
||||
return None
|
||||
|
||||
|
||||
def askdirectory (**options):
|
||||
"Ask for a directory, and return the file name"
|
||||
return Directory(**options).show()
|
||||
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# test stuff
|
||||
|
||||
def test():
|
||||
"""Simple test program."""
|
||||
root = Tk()
|
||||
root.withdraw()
|
||||
fd = LoadFileDialog(root)
|
||||
loadfile = fd.go(key="test")
|
||||
fd = SaveFileDialog(root)
|
||||
savefile = fd.go(key="test")
|
||||
print(loadfile, savefile)
|
||||
|
||||
# Since the file name may contain non-ASCII characters, we need
|
||||
# to find an encoding that likely supports the file name, and
|
||||
# displays correctly on the terminal.
|
||||
|
||||
# Start off with UTF-8
|
||||
enc = "utf-8"
|
||||
|
||||
# See whether CODESET is defined
|
||||
try:
|
||||
import locale
|
||||
locale.setlocale(locale.LC_ALL,'')
|
||||
enc = locale.nl_langinfo(locale.CODESET)
|
||||
except (ImportError, AttributeError):
|
||||
pass
|
||||
|
||||
# dialog for opening files
|
||||
|
||||
openfilename=askopenfilename(filetypes=[("all files", "*")])
|
||||
try:
|
||||
fp=open(openfilename,"r")
|
||||
fp.close()
|
||||
except BaseException as exc:
|
||||
print("Could not open File: ")
|
||||
print(exc)
|
||||
|
||||
print("open", openfilename.encode(enc))
|
||||
|
||||
# dialog for saving files
|
||||
|
||||
saveasfilename=asksaveasfilename()
|
||||
print("saveas", saveasfilename.encode(enc))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
test()
|
||||
239
.CondaPkg/env/Lib/tkinter/font.py
vendored
239
.CondaPkg/env/Lib/tkinter/font.py
vendored
@@ -1,239 +0,0 @@
|
||||
# Tkinter font wrapper
|
||||
#
|
||||
# written by Fredrik Lundh, February 1998
|
||||
#
|
||||
|
||||
import itertools
|
||||
import tkinter
|
||||
|
||||
__version__ = "0.9"
|
||||
__all__ = ["NORMAL", "ROMAN", "BOLD", "ITALIC",
|
||||
"nametofont", "Font", "families", "names"]
|
||||
|
||||
# weight/slant
|
||||
NORMAL = "normal"
|
||||
ROMAN = "roman"
|
||||
BOLD = "bold"
|
||||
ITALIC = "italic"
|
||||
|
||||
|
||||
def nametofont(name, root=None):
|
||||
"""Given the name of a tk named font, returns a Font representation.
|
||||
"""
|
||||
return Font(name=name, exists=True, root=root)
|
||||
|
||||
|
||||
class Font:
|
||||
"""Represents a named font.
|
||||
|
||||
Constructor options are:
|
||||
|
||||
font -- font specifier (name, system font, or (family, size, style)-tuple)
|
||||
name -- name to use for this font configuration (defaults to a unique name)
|
||||
exists -- does a named font by this name already exist?
|
||||
Creates a new named font if False, points to the existing font if True.
|
||||
Raises _tkinter.TclError if the assertion is false.
|
||||
|
||||
the following are ignored if font is specified:
|
||||
|
||||
family -- font 'family', e.g. Courier, Times, Helvetica
|
||||
size -- font size in points
|
||||
weight -- font thickness: NORMAL, BOLD
|
||||
slant -- font slant: ROMAN, ITALIC
|
||||
underline -- font underlining: false (0), true (1)
|
||||
overstrike -- font strikeout: false (0), true (1)
|
||||
|
||||
"""
|
||||
|
||||
counter = itertools.count(1)
|
||||
|
||||
def _set(self, kw):
|
||||
options = []
|
||||
for k, v in kw.items():
|
||||
options.append("-"+k)
|
||||
options.append(str(v))
|
||||
return tuple(options)
|
||||
|
||||
def _get(self, args):
|
||||
options = []
|
||||
for k in args:
|
||||
options.append("-"+k)
|
||||
return tuple(options)
|
||||
|
||||
def _mkdict(self, args):
|
||||
options = {}
|
||||
for i in range(0, len(args), 2):
|
||||
options[args[i][1:]] = args[i+1]
|
||||
return options
|
||||
|
||||
def __init__(self, root=None, font=None, name=None, exists=False,
|
||||
**options):
|
||||
if root is None:
|
||||
root = tkinter._get_default_root('use font')
|
||||
tk = getattr(root, 'tk', root)
|
||||
if font:
|
||||
# get actual settings corresponding to the given font
|
||||
font = tk.splitlist(tk.call("font", "actual", font))
|
||||
else:
|
||||
font = self._set(options)
|
||||
if not name:
|
||||
name = "font" + str(next(self.counter))
|
||||
self.name = name
|
||||
|
||||
if exists:
|
||||
self.delete_font = False
|
||||
# confirm font exists
|
||||
if self.name not in tk.splitlist(tk.call("font", "names")):
|
||||
raise tkinter._tkinter.TclError(
|
||||
"named font %s does not already exist" % (self.name,))
|
||||
# if font config info supplied, apply it
|
||||
if font:
|
||||
tk.call("font", "configure", self.name, *font)
|
||||
else:
|
||||
# create new font (raises TclError if the font exists)
|
||||
tk.call("font", "create", self.name, *font)
|
||||
self.delete_font = True
|
||||
self._tk = tk
|
||||
self._split = tk.splitlist
|
||||
self._call = tk.call
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def __repr__(self):
|
||||
return f"<{self.__class__.__module__}.{self.__class__.__qualname__}" \
|
||||
f" object {self.name!r}>"
|
||||
|
||||
def __eq__(self, other):
|
||||
if not isinstance(other, Font):
|
||||
return NotImplemented
|
||||
return self.name == other.name and self._tk == other._tk
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self.cget(key)
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
self.configure(**{key: value})
|
||||
|
||||
def __del__(self):
|
||||
try:
|
||||
if self.delete_font:
|
||||
self._call("font", "delete", self.name)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def copy(self):
|
||||
"Return a distinct copy of the current font"
|
||||
return Font(self._tk, **self.actual())
|
||||
|
||||
def actual(self, option=None, displayof=None):
|
||||
"Return actual font attributes"
|
||||
args = ()
|
||||
if displayof:
|
||||
args = ('-displayof', displayof)
|
||||
if option:
|
||||
args = args + ('-' + option, )
|
||||
return self._call("font", "actual", self.name, *args)
|
||||
else:
|
||||
return self._mkdict(
|
||||
self._split(self._call("font", "actual", self.name, *args)))
|
||||
|
||||
def cget(self, option):
|
||||
"Get font attribute"
|
||||
return self._call("font", "config", self.name, "-"+option)
|
||||
|
||||
def config(self, **options):
|
||||
"Modify font attributes"
|
||||
if options:
|
||||
self._call("font", "config", self.name,
|
||||
*self._set(options))
|
||||
else:
|
||||
return self._mkdict(
|
||||
self._split(self._call("font", "config", self.name)))
|
||||
|
||||
configure = config
|
||||
|
||||
def measure(self, text, displayof=None):
|
||||
"Return text width"
|
||||
args = (text,)
|
||||
if displayof:
|
||||
args = ('-displayof', displayof, text)
|
||||
return self._tk.getint(self._call("font", "measure", self.name, *args))
|
||||
|
||||
def metrics(self, *options, **kw):
|
||||
"""Return font metrics.
|
||||
|
||||
For best performance, create a dummy widget
|
||||
using this font before calling this method."""
|
||||
args = ()
|
||||
displayof = kw.pop('displayof', None)
|
||||
if displayof:
|
||||
args = ('-displayof', displayof)
|
||||
if options:
|
||||
args = args + self._get(options)
|
||||
return self._tk.getint(
|
||||
self._call("font", "metrics", self.name, *args))
|
||||
else:
|
||||
res = self._split(self._call("font", "metrics", self.name, *args))
|
||||
options = {}
|
||||
for i in range(0, len(res), 2):
|
||||
options[res[i][1:]] = self._tk.getint(res[i+1])
|
||||
return options
|
||||
|
||||
|
||||
def families(root=None, displayof=None):
|
||||
"Get font families (as a tuple)"
|
||||
if root is None:
|
||||
root = tkinter._get_default_root('use font.families()')
|
||||
args = ()
|
||||
if displayof:
|
||||
args = ('-displayof', displayof)
|
||||
return root.tk.splitlist(root.tk.call("font", "families", *args))
|
||||
|
||||
|
||||
def names(root=None):
|
||||
"Get names of defined fonts (as a tuple)"
|
||||
if root is None:
|
||||
root = tkinter._get_default_root('use font.names()')
|
||||
return root.tk.splitlist(root.tk.call("font", "names"))
|
||||
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# test stuff
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
root = tkinter.Tk()
|
||||
|
||||
# create a font
|
||||
f = Font(family="times", size=30, weight=NORMAL)
|
||||
|
||||
print(f.actual())
|
||||
print(f.actual("family"))
|
||||
print(f.actual("weight"))
|
||||
|
||||
print(f.config())
|
||||
print(f.cget("family"))
|
||||
print(f.cget("weight"))
|
||||
|
||||
print(names())
|
||||
|
||||
print(f.measure("hello"), f.metrics("linespace"))
|
||||
|
||||
print(f.metrics(displayof=root))
|
||||
|
||||
f = Font(font=("Courier", 20, "bold"))
|
||||
print(f.measure("hello"), f.metrics("linespace", displayof=root))
|
||||
|
||||
w = tkinter.Label(root, text="Hello, world", font=f)
|
||||
w.pack()
|
||||
|
||||
w = tkinter.Button(root, text="Quit!", command=root.destroy)
|
||||
w.pack()
|
||||
|
||||
fb = Font(font=w["font"]).copy()
|
||||
fb.config(weight=BOLD)
|
||||
|
||||
w.config(font=fb)
|
||||
|
||||
tkinter.mainloop()
|
||||
146
.CondaPkg/env/Lib/tkinter/messagebox.py
vendored
146
.CondaPkg/env/Lib/tkinter/messagebox.py
vendored
@@ -1,146 +0,0 @@
|
||||
# tk common message boxes
|
||||
#
|
||||
# this module provides an interface to the native message boxes
|
||||
# available in Tk 4.2 and newer.
|
||||
#
|
||||
# written by Fredrik Lundh, May 1997
|
||||
#
|
||||
|
||||
#
|
||||
# options (all have default values):
|
||||
#
|
||||
# - default: which button to make default (one of the reply codes)
|
||||
#
|
||||
# - icon: which icon to display (see below)
|
||||
#
|
||||
# - message: the message to display
|
||||
#
|
||||
# - parent: which window to place the dialog on top of
|
||||
#
|
||||
# - title: dialog title
|
||||
#
|
||||
# - type: dialog type; that is, which buttons to display (see below)
|
||||
#
|
||||
|
||||
from tkinter.commondialog import Dialog
|
||||
|
||||
__all__ = ["showinfo", "showwarning", "showerror",
|
||||
"askquestion", "askokcancel", "askyesno",
|
||||
"askyesnocancel", "askretrycancel"]
|
||||
|
||||
#
|
||||
# constants
|
||||
|
||||
# icons
|
||||
ERROR = "error"
|
||||
INFO = "info"
|
||||
QUESTION = "question"
|
||||
WARNING = "warning"
|
||||
|
||||
# types
|
||||
ABORTRETRYIGNORE = "abortretryignore"
|
||||
OK = "ok"
|
||||
OKCANCEL = "okcancel"
|
||||
RETRYCANCEL = "retrycancel"
|
||||
YESNO = "yesno"
|
||||
YESNOCANCEL = "yesnocancel"
|
||||
|
||||
# replies
|
||||
ABORT = "abort"
|
||||
RETRY = "retry"
|
||||
IGNORE = "ignore"
|
||||
OK = "ok"
|
||||
CANCEL = "cancel"
|
||||
YES = "yes"
|
||||
NO = "no"
|
||||
|
||||
|
||||
#
|
||||
# message dialog class
|
||||
|
||||
class Message(Dialog):
|
||||
"A message box"
|
||||
|
||||
command = "tk_messageBox"
|
||||
|
||||
|
||||
#
|
||||
# convenience stuff
|
||||
|
||||
# Rename _icon and _type options to allow overriding them in options
|
||||
def _show(title=None, message=None, _icon=None, _type=None, **options):
|
||||
if _icon and "icon" not in options: options["icon"] = _icon
|
||||
if _type and "type" not in options: options["type"] = _type
|
||||
if title: options["title"] = title
|
||||
if message: options["message"] = message
|
||||
res = Message(**options).show()
|
||||
# In some Tcl installations, yes/no is converted into a boolean.
|
||||
if isinstance(res, bool):
|
||||
if res:
|
||||
return YES
|
||||
return NO
|
||||
# In others we get a Tcl_Obj.
|
||||
return str(res)
|
||||
|
||||
|
||||
def showinfo(title=None, message=None, **options):
|
||||
"Show an info message"
|
||||
return _show(title, message, INFO, OK, **options)
|
||||
|
||||
|
||||
def showwarning(title=None, message=None, **options):
|
||||
"Show a warning message"
|
||||
return _show(title, message, WARNING, OK, **options)
|
||||
|
||||
|
||||
def showerror(title=None, message=None, **options):
|
||||
"Show an error message"
|
||||
return _show(title, message, ERROR, OK, **options)
|
||||
|
||||
|
||||
def askquestion(title=None, message=None, **options):
|
||||
"Ask a question"
|
||||
return _show(title, message, QUESTION, YESNO, **options)
|
||||
|
||||
|
||||
def askokcancel(title=None, message=None, **options):
|
||||
"Ask if operation should proceed; return true if the answer is ok"
|
||||
s = _show(title, message, QUESTION, OKCANCEL, **options)
|
||||
return s == OK
|
||||
|
||||
|
||||
def askyesno(title=None, message=None, **options):
|
||||
"Ask a question; return true if the answer is yes"
|
||||
s = _show(title, message, QUESTION, YESNO, **options)
|
||||
return s == YES
|
||||
|
||||
|
||||
def askyesnocancel(title=None, message=None, **options):
|
||||
"Ask a question; return true if the answer is yes, None if cancelled."
|
||||
s = _show(title, message, QUESTION, YESNOCANCEL, **options)
|
||||
# s might be a Tcl index object, so convert it to a string
|
||||
s = str(s)
|
||||
if s == CANCEL:
|
||||
return None
|
||||
return s == YES
|
||||
|
||||
|
||||
def askretrycancel(title=None, message=None, **options):
|
||||
"Ask if operation should be retried; return true if the answer is yes"
|
||||
s = _show(title, message, WARNING, RETRYCANCEL, **options)
|
||||
return s == RETRY
|
||||
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# test stuff
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
print("info", showinfo("Spam", "Egg Information"))
|
||||
print("warning", showwarning("Spam", "Egg Warning"))
|
||||
print("error", showerror("Spam", "Egg Alert"))
|
||||
print("question", askquestion("Spam", "Question?"))
|
||||
print("proceed", askokcancel("Spam", "Proceed?"))
|
||||
print("yes/no", askyesno("Spam", "Got it?"))
|
||||
print("yes/no/cancel", askyesnocancel("Spam", "Want it?"))
|
||||
print("try again", askretrycancel("Spam", "Try again?"))
|
||||
56
.CondaPkg/env/Lib/tkinter/scrolledtext.py
vendored
56
.CondaPkg/env/Lib/tkinter/scrolledtext.py
vendored
@@ -1,56 +0,0 @@
|
||||
"""A ScrolledText widget feels like a text widget but also has a
|
||||
vertical scroll bar on its right. (Later, options may be added to
|
||||
add a horizontal bar as well, to make the bars disappear
|
||||
automatically when not needed, to move them to the other side of the
|
||||
window, etc.)
|
||||
|
||||
Configuration options are passed to the Text widget.
|
||||
A Frame widget is inserted between the master and the text, to hold
|
||||
the Scrollbar widget.
|
||||
Most methods calls are inherited from the Text widget; Pack, Grid and
|
||||
Place methods are redirected to the Frame widget however.
|
||||
"""
|
||||
|
||||
from tkinter import Frame, Text, Scrollbar, Pack, Grid, Place
|
||||
from tkinter.constants import RIGHT, LEFT, Y, BOTH
|
||||
|
||||
__all__ = ['ScrolledText']
|
||||
|
||||
|
||||
class ScrolledText(Text):
|
||||
def __init__(self, master=None, **kw):
|
||||
self.frame = Frame(master)
|
||||
self.vbar = Scrollbar(self.frame)
|
||||
self.vbar.pack(side=RIGHT, fill=Y)
|
||||
|
||||
kw.update({'yscrollcommand': self.vbar.set})
|
||||
Text.__init__(self, self.frame, **kw)
|
||||
self.pack(side=LEFT, fill=BOTH, expand=True)
|
||||
self.vbar['command'] = self.yview
|
||||
|
||||
# Copy geometry methods of self.frame without overriding Text
|
||||
# methods -- hack!
|
||||
text_meths = vars(Text).keys()
|
||||
methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys()
|
||||
methods = methods.difference(text_meths)
|
||||
|
||||
for m in methods:
|
||||
if m[0] != '_' and m != 'config' and m != 'configure':
|
||||
setattr(self, m, getattr(self.frame, m))
|
||||
|
||||
def __str__(self):
|
||||
return str(self.frame)
|
||||
|
||||
|
||||
def example():
|
||||
from tkinter.constants import END
|
||||
|
||||
stext = ScrolledText(bg='white', height=10)
|
||||
stext.insert(END, __doc__)
|
||||
stext.pack(fill=BOTH, side=LEFT, expand=True)
|
||||
stext.focus_set()
|
||||
stext.mainloop()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
example()
|
||||
441
.CondaPkg/env/Lib/tkinter/simpledialog.py
vendored
441
.CondaPkg/env/Lib/tkinter/simpledialog.py
vendored
@@ -1,441 +0,0 @@
|
||||
#
|
||||
# An Introduction to Tkinter
|
||||
#
|
||||
# Copyright (c) 1997 by Fredrik Lundh
|
||||
#
|
||||
# This copyright applies to Dialog, askinteger, askfloat and asktring
|
||||
#
|
||||
# fredrik@pythonware.com
|
||||
# http://www.pythonware.com
|
||||
#
|
||||
"""This modules handles dialog boxes.
|
||||
|
||||
It contains the following public symbols:
|
||||
|
||||
SimpleDialog -- A simple but flexible modal dialog box
|
||||
|
||||
Dialog -- a base class for dialogs
|
||||
|
||||
askinteger -- get an integer from the user
|
||||
|
||||
askfloat -- get a float from the user
|
||||
|
||||
askstring -- get a string from the user
|
||||
"""
|
||||
|
||||
from tkinter import *
|
||||
from tkinter import _get_temp_root, _destroy_temp_root
|
||||
from tkinter import messagebox
|
||||
|
||||
|
||||
class SimpleDialog:
|
||||
|
||||
def __init__(self, master,
|
||||
text='', buttons=[], default=None, cancel=None,
|
||||
title=None, class_=None):
|
||||
if class_:
|
||||
self.root = Toplevel(master, class_=class_)
|
||||
else:
|
||||
self.root = Toplevel(master)
|
||||
if title:
|
||||
self.root.title(title)
|
||||
self.root.iconname(title)
|
||||
|
||||
_setup_dialog(self.root)
|
||||
|
||||
self.message = Message(self.root, text=text, aspect=400)
|
||||
self.message.pack(expand=1, fill=BOTH)
|
||||
self.frame = Frame(self.root)
|
||||
self.frame.pack()
|
||||
self.num = default
|
||||
self.cancel = cancel
|
||||
self.default = default
|
||||
self.root.bind('<Return>', self.return_event)
|
||||
for num in range(len(buttons)):
|
||||
s = buttons[num]
|
||||
b = Button(self.frame, text=s,
|
||||
command=(lambda self=self, num=num: self.done(num)))
|
||||
if num == default:
|
||||
b.config(relief=RIDGE, borderwidth=8)
|
||||
b.pack(side=LEFT, fill=BOTH, expand=1)
|
||||
self.root.protocol('WM_DELETE_WINDOW', self.wm_delete_window)
|
||||
self.root.transient(master)
|
||||
_place_window(self.root, master)
|
||||
|
||||
def go(self):
|
||||
self.root.wait_visibility()
|
||||
self.root.grab_set()
|
||||
self.root.mainloop()
|
||||
self.root.destroy()
|
||||
return self.num
|
||||
|
||||
def return_event(self, event):
|
||||
if self.default is None:
|
||||
self.root.bell()
|
||||
else:
|
||||
self.done(self.default)
|
||||
|
||||
def wm_delete_window(self):
|
||||
if self.cancel is None:
|
||||
self.root.bell()
|
||||
else:
|
||||
self.done(self.cancel)
|
||||
|
||||
def done(self, num):
|
||||
self.num = num
|
||||
self.root.quit()
|
||||
|
||||
|
||||
class Dialog(Toplevel):
|
||||
|
||||
'''Class to open dialogs.
|
||||
|
||||
This class is intended as a base class for custom dialogs
|
||||
'''
|
||||
|
||||
def __init__(self, parent, title = None):
|
||||
'''Initialize a dialog.
|
||||
|
||||
Arguments:
|
||||
|
||||
parent -- a parent window (the application window)
|
||||
|
||||
title -- the dialog title
|
||||
'''
|
||||
master = parent
|
||||
if master is None:
|
||||
master = _get_temp_root()
|
||||
|
||||
Toplevel.__init__(self, master)
|
||||
|
||||
self.withdraw() # remain invisible for now
|
||||
# If the parent is not viewable, don't
|
||||
# make the child transient, or else it
|
||||
# would be opened withdrawn
|
||||
if parent is not None and parent.winfo_viewable():
|
||||
self.transient(parent)
|
||||
|
||||
if title:
|
||||
self.title(title)
|
||||
|
||||
_setup_dialog(self)
|
||||
|
||||
self.parent = parent
|
||||
|
||||
self.result = None
|
||||
|
||||
body = Frame(self)
|
||||
self.initial_focus = self.body(body)
|
||||
body.pack(padx=5, pady=5)
|
||||
|
||||
self.buttonbox()
|
||||
|
||||
if self.initial_focus is None:
|
||||
self.initial_focus = self
|
||||
|
||||
self.protocol("WM_DELETE_WINDOW", self.cancel)
|
||||
|
||||
_place_window(self, parent)
|
||||
|
||||
self.initial_focus.focus_set()
|
||||
|
||||
# wait for window to appear on screen before calling grab_set
|
||||
self.wait_visibility()
|
||||
self.grab_set()
|
||||
self.wait_window(self)
|
||||
|
||||
def destroy(self):
|
||||
'''Destroy the window'''
|
||||
self.initial_focus = None
|
||||
Toplevel.destroy(self)
|
||||
_destroy_temp_root(self.master)
|
||||
|
||||
#
|
||||
# construction hooks
|
||||
|
||||
def body(self, master):
|
||||
'''create dialog body.
|
||||
|
||||
return widget that should have initial focus.
|
||||
This method should be overridden, and is called
|
||||
by the __init__ method.
|
||||
'''
|
||||
pass
|
||||
|
||||
def buttonbox(self):
|
||||
'''add standard button box.
|
||||
|
||||
override if you do not want the standard buttons
|
||||
'''
|
||||
|
||||
box = Frame(self)
|
||||
|
||||
w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE)
|
||||
w.pack(side=LEFT, padx=5, pady=5)
|
||||
w = Button(box, text="Cancel", width=10, command=self.cancel)
|
||||
w.pack(side=LEFT, padx=5, pady=5)
|
||||
|
||||
self.bind("<Return>", self.ok)
|
||||
self.bind("<Escape>", self.cancel)
|
||||
|
||||
box.pack()
|
||||
|
||||
#
|
||||
# standard button semantics
|
||||
|
||||
def ok(self, event=None):
|
||||
|
||||
if not self.validate():
|
||||
self.initial_focus.focus_set() # put focus back
|
||||
return
|
||||
|
||||
self.withdraw()
|
||||
self.update_idletasks()
|
||||
|
||||
try:
|
||||
self.apply()
|
||||
finally:
|
||||
self.cancel()
|
||||
|
||||
def cancel(self, event=None):
|
||||
|
||||
# put focus back to the parent window
|
||||
if self.parent is not None:
|
||||
self.parent.focus_set()
|
||||
self.destroy()
|
||||
|
||||
#
|
||||
# command hooks
|
||||
|
||||
def validate(self):
|
||||
'''validate the data
|
||||
|
||||
This method is called automatically to validate the data before the
|
||||
dialog is destroyed. By default, it always validates OK.
|
||||
'''
|
||||
|
||||
return 1 # override
|
||||
|
||||
def apply(self):
|
||||
'''process the data
|
||||
|
||||
This method is called automatically to process the data, *after*
|
||||
the dialog is destroyed. By default, it does nothing.
|
||||
'''
|
||||
|
||||
pass # override
|
||||
|
||||
|
||||
# Place a toplevel window at the center of parent or screen
|
||||
# It is a Python implementation of ::tk::PlaceWindow.
|
||||
def _place_window(w, parent=None):
|
||||
w.wm_withdraw() # Remain invisible while we figure out the geometry
|
||||
w.update_idletasks() # Actualize geometry information
|
||||
|
||||
minwidth = w.winfo_reqwidth()
|
||||
minheight = w.winfo_reqheight()
|
||||
maxwidth = w.winfo_vrootwidth()
|
||||
maxheight = w.winfo_vrootheight()
|
||||
if parent is not None and parent.winfo_ismapped():
|
||||
x = parent.winfo_rootx() + (parent.winfo_width() - minwidth) // 2
|
||||
y = parent.winfo_rooty() + (parent.winfo_height() - minheight) // 2
|
||||
vrootx = w.winfo_vrootx()
|
||||
vrooty = w.winfo_vrooty()
|
||||
x = min(x, vrootx + maxwidth - minwidth)
|
||||
x = max(x, vrootx)
|
||||
y = min(y, vrooty + maxheight - minheight)
|
||||
y = max(y, vrooty)
|
||||
if w._windowingsystem == 'aqua':
|
||||
# Avoid the native menu bar which sits on top of everything.
|
||||
y = max(y, 22)
|
||||
else:
|
||||
x = (w.winfo_screenwidth() - minwidth) // 2
|
||||
y = (w.winfo_screenheight() - minheight) // 2
|
||||
|
||||
w.wm_maxsize(maxwidth, maxheight)
|
||||
w.wm_geometry('+%d+%d' % (x, y))
|
||||
w.wm_deiconify() # Become visible at the desired location
|
||||
|
||||
|
||||
def _setup_dialog(w):
|
||||
if w._windowingsystem == "aqua":
|
||||
w.tk.call("::tk::unsupported::MacWindowStyle", "style",
|
||||
w, "moveableModal", "")
|
||||
elif w._windowingsystem == "x11":
|
||||
w.wm_attributes("-type", "dialog")
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# convenience dialogues
|
||||
|
||||
class _QueryDialog(Dialog):
|
||||
|
||||
def __init__(self, title, prompt,
|
||||
initialvalue=None,
|
||||
minvalue = None, maxvalue = None,
|
||||
parent = None):
|
||||
|
||||
self.prompt = prompt
|
||||
self.minvalue = minvalue
|
||||
self.maxvalue = maxvalue
|
||||
|
||||
self.initialvalue = initialvalue
|
||||
|
||||
Dialog.__init__(self, parent, title)
|
||||
|
||||
def destroy(self):
|
||||
self.entry = None
|
||||
Dialog.destroy(self)
|
||||
|
||||
def body(self, master):
|
||||
|
||||
w = Label(master, text=self.prompt, justify=LEFT)
|
||||
w.grid(row=0, padx=5, sticky=W)
|
||||
|
||||
self.entry = Entry(master, name="entry")
|
||||
self.entry.grid(row=1, padx=5, sticky=W+E)
|
||||
|
||||
if self.initialvalue is not None:
|
||||
self.entry.insert(0, self.initialvalue)
|
||||
self.entry.select_range(0, END)
|
||||
|
||||
return self.entry
|
||||
|
||||
def validate(self):
|
||||
try:
|
||||
result = self.getresult()
|
||||
except ValueError:
|
||||
messagebox.showwarning(
|
||||
"Illegal value",
|
||||
self.errormessage + "\nPlease try again",
|
||||
parent = self
|
||||
)
|
||||
return 0
|
||||
|
||||
if self.minvalue is not None and result < self.minvalue:
|
||||
messagebox.showwarning(
|
||||
"Too small",
|
||||
"The allowed minimum value is %s. "
|
||||
"Please try again." % self.minvalue,
|
||||
parent = self
|
||||
)
|
||||
return 0
|
||||
|
||||
if self.maxvalue is not None and result > self.maxvalue:
|
||||
messagebox.showwarning(
|
||||
"Too large",
|
||||
"The allowed maximum value is %s. "
|
||||
"Please try again." % self.maxvalue,
|
||||
parent = self
|
||||
)
|
||||
return 0
|
||||
|
||||
self.result = result
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
class _QueryInteger(_QueryDialog):
|
||||
errormessage = "Not an integer."
|
||||
|
||||
def getresult(self):
|
||||
return self.getint(self.entry.get())
|
||||
|
||||
|
||||
def askinteger(title, prompt, **kw):
|
||||
'''get an integer from the user
|
||||
|
||||
Arguments:
|
||||
|
||||
title -- the dialog title
|
||||
prompt -- the label text
|
||||
**kw -- see SimpleDialog class
|
||||
|
||||
Return value is an integer
|
||||
'''
|
||||
d = _QueryInteger(title, prompt, **kw)
|
||||
return d.result
|
||||
|
||||
|
||||
class _QueryFloat(_QueryDialog):
|
||||
errormessage = "Not a floating point value."
|
||||
|
||||
def getresult(self):
|
||||
return self.getdouble(self.entry.get())
|
||||
|
||||
|
||||
def askfloat(title, prompt, **kw):
|
||||
'''get a float from the user
|
||||
|
||||
Arguments:
|
||||
|
||||
title -- the dialog title
|
||||
prompt -- the label text
|
||||
**kw -- see SimpleDialog class
|
||||
|
||||
Return value is a float
|
||||
'''
|
||||
d = _QueryFloat(title, prompt, **kw)
|
||||
return d.result
|
||||
|
||||
|
||||
class _QueryString(_QueryDialog):
|
||||
def __init__(self, *args, **kw):
|
||||
if "show" in kw:
|
||||
self.__show = kw["show"]
|
||||
del kw["show"]
|
||||
else:
|
||||
self.__show = None
|
||||
_QueryDialog.__init__(self, *args, **kw)
|
||||
|
||||
def body(self, master):
|
||||
entry = _QueryDialog.body(self, master)
|
||||
if self.__show is not None:
|
||||
entry.configure(show=self.__show)
|
||||
return entry
|
||||
|
||||
def getresult(self):
|
||||
return self.entry.get()
|
||||
|
||||
|
||||
def askstring(title, prompt, **kw):
|
||||
'''get a string from the user
|
||||
|
||||
Arguments:
|
||||
|
||||
title -- the dialog title
|
||||
prompt -- the label text
|
||||
**kw -- see SimpleDialog class
|
||||
|
||||
Return value is a string
|
||||
'''
|
||||
d = _QueryString(title, prompt, **kw)
|
||||
return d.result
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
def test():
|
||||
root = Tk()
|
||||
def doit(root=root):
|
||||
d = SimpleDialog(root,
|
||||
text="This is a test dialog. "
|
||||
"Would this have been an actual dialog, "
|
||||
"the buttons below would have been glowing "
|
||||
"in soft pink light.\n"
|
||||
"Do you believe this?",
|
||||
buttons=["Yes", "No", "Cancel"],
|
||||
default=0,
|
||||
cancel=2,
|
||||
title="Test Dialog")
|
||||
print(d.go())
|
||||
print(askinteger("Spam", "Egg count", initialvalue=12*12))
|
||||
print(askfloat("Spam", "Egg weight\n(in tons)", minvalue=1,
|
||||
maxvalue=100))
|
||||
print(askstring("Spam", "Egg label"))
|
||||
t = Button(root, text='Test', command=doit)
|
||||
t.pack()
|
||||
q = Button(root, text='Quit', command=t.quit)
|
||||
q.pack()
|
||||
t.mainloop()
|
||||
|
||||
test()
|
||||
1948
.CondaPkg/env/Lib/tkinter/tix.py
vendored
1948
.CondaPkg/env/Lib/tkinter/tix.py
vendored
File diff suppressed because it is too large
Load Diff
1637
.CondaPkg/env/Lib/tkinter/ttk.py
vendored
1637
.CondaPkg/env/Lib/tkinter/ttk.py
vendored
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user