Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
b6584698
Kaydet (Commit)
b6584698
authored
Şub 15, 2000
tarafından
Guido van Rossum
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
New stack viewer, uses a tree widget.
(XXX: the debugger doesn't yet use this.)
üst
553fa443
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
89 additions
and
230 deletions
+89
-230
StackViewer.py
Tools/idle/StackViewer.py
+89
-230
No files found.
Tools/idle/StackViewer.py
Dosyayı görüntüle @
b6584698
import
string
import
sys
import
os
from
Tkinter
import
*
import
linecache
from
repr
import
Repr
from
WindowList
import
ListedToplevel
from
ScrolledList
import
ScrolledList
from
TreeWidget
import
TreeNode
,
TreeItem
,
ScrolledCanvas
from
ObjectBrowser
import
ObjectTreeItem
,
make_objecttreeitem
from
OldStackViewer
import
StackViewer
,
NamespaceViewer
def
StackBrowser
(
root
,
flist
=
None
,
stack
=
None
):
top
=
Toplevel
(
root
)
sc
=
ScrolledCanvas
(
top
,
bg
=
"white"
,
highlightthickness
=
0
)
sc
.
frame
.
pack
(
expand
=
1
,
fill
=
"both"
)
item
=
StackTreeItem
(
flist
)
node
=
TreeNode
(
sc
.
canvas
,
None
,
item
)
node
.
expand
()
class
Stack
Browser
:
class
Stack
TreeItem
(
TreeItem
)
:
def
__init__
(
self
,
root
,
flist
,
stack
=
None
):
self
.
top
=
top
=
ListedToplevel
(
root
)
top
.
protocol
(
"WM_DELETE_WINDOW"
,
self
.
close
)
top
.
bind
(
"<Key-Escape>"
,
self
.
close
)
top
.
wm_title
(
"Stack viewer"
)
top
.
wm_iconname
(
"Stack"
)
# Create help label
self
.
helplabel
=
Label
(
top
,
text
=
"Click once to view variables; twice for source"
,
borderwidth
=
2
,
relief
=
"groove"
)
self
.
helplabel
.
pack
(
fill
=
"x"
)
#
self
.
sv
=
StackViewer
(
top
,
flist
,
self
)
if
stack
is
None
:
stack
=
get_stack
()
self
.
sv
.
load_stack
(
stack
)
def
close
(
self
,
event
=
None
):
self
.
top
.
destroy
()
localsframe
=
None
localsviewer
=
None
localsdict
=
None
globalsframe
=
None
globalsviewer
=
None
globalsdict
=
None
curframe
=
None
def
show_frame
(
self
,
(
frame
,
lineno
)):
if
frame
is
self
.
curframe
:
return
self
.
curframe
=
None
if
frame
.
f_globals
is
not
self
.
globalsdict
:
self
.
show_globals
(
frame
)
self
.
show_locals
(
frame
)
self
.
curframe
=
frame
def
show_globals
(
self
,
frame
):
title
=
"Global Variables"
if
frame
.
f_globals
.
has_key
(
"__name__"
):
try
:
name
=
str
(
frame
.
f_globals
[
"__name__"
])
+
""
except
:
name
=
""
if
name
:
title
=
title
+
" in module "
+
name
self
.
globalsdict
=
None
if
self
.
globalsviewer
:
self
.
globalsviewer
.
close
()
self
.
globalsviewer
=
None
if
not
self
.
globalsframe
:
self
.
globalsframe
=
Frame
(
self
.
top
)
self
.
globalsdict
=
frame
.
f_globals
self
.
globalsviewer
=
NamespaceViewer
(
self
.
globalsframe
,
title
,
self
.
globalsdict
)
self
.
globalsframe
.
pack
(
fill
=
"both"
,
side
=
"bottom"
)
def
__init__
(
self
,
flist
=
None
):
self
.
flist
=
flist
self
.
stack
=
get_stack
()
self
.
text
=
get_exception
()
def
show_locals
(
self
,
frame
):
self
.
localsdict
=
None
if
self
.
localsviewer
:
self
.
localsviewer
.
close
()
self
.
localsviewer
=
None
if
frame
.
f_locals
is
not
frame
.
f_globals
:
title
=
"Local Variables"
code
=
frame
.
f_code
funcname
=
code
.
co_name
if
funcname
not
in
(
"?"
,
""
,
None
):
title
=
title
+
" in "
+
funcname
if
not
self
.
localsframe
:
self
.
localsframe
=
Frame
(
self
.
top
)
self
.
localsdict
=
frame
.
f_locals
self
.
localsviewer
=
NamespaceViewer
(
self
.
localsframe
,
title
,
self
.
localsdict
)
self
.
localsframe
.
pack
(
fill
=
"both"
,
side
=
"top"
)
else
:
if
self
.
localsframe
:
self
.
localsframe
.
forget
()
def
GetText
(
self
):
return
self
.
text
def
GetSubList
(
self
):
sublist
=
[]
for
info
in
self
.
stack
:
item
=
FrameTreeItem
(
info
,
self
.
flist
)
sublist
.
append
(
item
)
return
sublist
class
StackViewer
(
ScrolledList
):
class
FrameTreeItem
(
TreeItem
):
def
__init__
(
self
,
master
,
flist
,
browser
):
ScrolledList
.
__init__
(
self
,
master
,
width
=
80
)
def
__init__
(
self
,
info
,
flist
):
self
.
info
=
info
self
.
flist
=
flist
self
.
browser
=
browser
self
.
stack
=
[]
def
load_stack
(
self
,
stack
,
index
=
None
):
self
.
stack
=
stack
self
.
clear
()
## if len(stack) > 10:
## l["height"] = 10
## self.topframe.pack(expand=1)
## else:
## l["height"] = len(stack)
## self.topframe.pack(expand=0)
for
i
in
range
(
len
(
stack
)):
frame
,
lineno
=
stack
[
i
]
try
:
modname
=
frame
.
f_globals
[
"__name__"
]
except
:
modname
=
"?"
code
=
frame
.
f_code
filename
=
code
.
co_filename
funcname
=
code
.
co_name
sourceline
=
linecache
.
getline
(
filename
,
lineno
)
sourceline
=
string
.
strip
(
sourceline
)
if
funcname
in
(
"?"
,
""
,
None
):
item
=
"
%
s, line
%
d:
%
s"
%
(
modname
,
lineno
,
sourceline
)
else
:
item
=
"
%
s.
%
s(), line
%
d:
%
s"
%
(
modname
,
funcname
,
lineno
,
sourceline
)
if
i
==
index
:
item
=
"> "
+
item
self
.
append
(
item
)
if
index
is
not
None
:
self
.
select
(
index
)
def
popup_event
(
self
,
event
):
if
self
.
stack
:
return
ScrolledList
.
popup_event
(
self
,
event
)
def
fill_menu
(
self
):
menu
=
self
.
menu
menu
.
add_command
(
label
=
"Go to source line"
,
command
=
self
.
goto_source_line
)
menu
.
add_command
(
label
=
"Show stack frame"
,
command
=
self
.
show_stack_frame
)
def
on_select
(
self
,
index
):
if
0
<=
index
<
len
(
self
.
stack
):
self
.
browser
.
show_frame
(
self
.
stack
[
index
])
def
GetText
(
self
):
frame
,
lineno
=
self
.
info
try
:
modname
=
frame
.
f_globals
[
"__name__"
]
except
:
modname
=
"?"
code
=
frame
.
f_code
filename
=
code
.
co_filename
funcname
=
code
.
co_name
sourceline
=
linecache
.
getline
(
filename
,
lineno
)
sourceline
=
string
.
strip
(
sourceline
)
if
funcname
in
(
"?"
,
""
,
None
):
item
=
"
%
s, line
%
d:
%
s"
%
(
modname
,
lineno
,
sourceline
)
else
:
item
=
"
%
s.
%
s(...), line
%
d:
%
s"
%
(
modname
,
funcname
,
lineno
,
sourceline
)
## if i == index:
## item = "> " + item
return
item
def
GetSubList
(
self
):
frame
,
lineno
=
self
.
info
sublist
=
[]
if
frame
.
f_globals
is
not
frame
.
f_locals
:
item
=
VariablesTreeItem
(
"<locals>"
,
frame
.
f_locals
,
self
.
flist
)
sublist
.
append
(
item
)
item
=
VariablesTreeItem
(
"<globals>"
,
frame
.
f_globals
,
self
.
flist
)
sublist
.
append
(
item
)
return
sublist
def
OnDoubleClick
(
self
):
if
self
.
flist
:
frame
,
lineno
=
self
.
info
filename
=
frame
.
f_code
.
co_filename
edit
=
self
.
flist
.
open
(
filename
)
edit
.
gotoline
(
lineno
)
def
on_double
(
self
,
index
):
self
.
show_source
(
index
)
class
VariablesTreeItem
(
ObjectTreeItem
):
def
goto_source_line
(
self
):
index
=
self
.
listbox
.
index
(
"active"
)
self
.
show_source
(
index
)
def
GetText
(
self
):
return
self
.
labeltext
def
show_stack_frame
(
self
):
index
=
self
.
listbox
.
index
(
"active"
)
if
0
<=
index
<
len
(
self
.
stack
):
self
.
browser
.
show_frame
(
self
.
stack
[
index
])
def
GetLabelText
(
self
):
return
None
def
show_source
(
self
,
index
):
if
not
(
0
<=
index
<
len
(
self
.
stack
)):
return
frame
,
lineno
=
self
.
stack
[
index
]
code
=
frame
.
f_code
filename
=
code
.
co_filename
if
os
.
path
.
isfile
(
filename
):
edit
=
self
.
flist
.
open
(
filename
)
if
edit
:
edit
.
gotoline
(
lineno
)
def
IsExpandable
(
self
):
return
len
(
self
.
object
)
>
0
def
keys
(
self
):
return
self
.
object
.
keys
()
def
GetSubList
(
self
):
sublist
=
[]
for
key
in
self
.
keys
():
try
:
value
=
self
.
object
[
key
]
except
KeyError
:
continue
def
setfunction
(
value
,
key
=
key
,
object
=
self
.
object
):
object
[
key
]
=
value
item
=
make_objecttreeitem
(
key
+
" ="
,
value
,
setfunction
)
sublist
.
append
(
item
)
return
sublist
def
get_stack
(
t
=
None
,
f
=
None
):
if
t
is
None
:
t
=
sys
.
last_traceback
...
...
@@ -189,8 +118,7 @@ def get_stack(t=None, f=None):
t
=
t
.
tb_next
return
stack
def
getexception
(
type
=
None
,
value
=
None
):
def
get_exception
(
type
=
None
,
value
=
None
):
if
type
is
None
:
type
=
sys
.
last_type
value
=
sys
.
last_value
...
...
@@ -201,76 +129,7 @@ def getexception(type=None, value=None):
s
=
s
+
": "
+
str
(
value
)
return
s
class
NamespaceViewer
:
def
__init__
(
self
,
master
,
title
,
dict
=
None
):
width
=
0
height
=
40
if
dict
:
height
=
20
*
len
(
dict
)
# XXX 20 == observed height of Entry widget
self
.
master
=
master
self
.
title
=
title
self
.
repr
=
Repr
()
self
.
repr
.
maxstring
=
60
self
.
repr
.
maxother
=
60
self
.
frame
=
frame
=
Frame
(
master
)
self
.
frame
.
pack
(
expand
=
1
,
fill
=
"both"
)
self
.
label
=
Label
(
frame
,
text
=
title
,
borderwidth
=
2
,
relief
=
"groove"
)
self
.
label
.
pack
(
fill
=
"x"
)
self
.
vbar
=
vbar
=
Scrollbar
(
frame
,
name
=
"vbar"
)
vbar
.
pack
(
side
=
"right"
,
fill
=
"y"
)
self
.
canvas
=
canvas
=
Canvas
(
frame
,
height
=
min
(
300
,
max
(
40
,
height
)),
scrollregion
=
(
0
,
0
,
width
,
height
))
canvas
.
pack
(
side
=
"left"
,
fill
=
"both"
,
expand
=
1
)
vbar
[
"command"
]
=
canvas
.
yview
canvas
[
"yscrollcommand"
]
=
vbar
.
set
self
.
subframe
=
subframe
=
Frame
(
canvas
)
self
.
sfid
=
canvas
.
create_window
(
0
,
0
,
window
=
subframe
,
anchor
=
"nw"
)
self
.
load_dict
(
dict
)
dict
=
-
1
def
load_dict
(
self
,
dict
,
force
=
0
):
if
dict
is
self
.
dict
and
not
force
:
return
subframe
=
self
.
subframe
frame
=
self
.
frame
for
c
in
subframe
.
children
.
values
():
c
.
destroy
()
self
.
dict
=
None
if
not
dict
:
l
=
Label
(
subframe
,
text
=
"None"
)
l
.
grid
(
row
=
0
,
column
=
0
)
else
:
names
=
dict
.
keys
()
names
.
sort
()
row
=
0
for
name
in
names
:
value
=
dict
[
name
]
svalue
=
self
.
repr
.
repr
(
value
)
# repr(value)
l
=
Label
(
subframe
,
text
=
name
)
l
.
grid
(
row
=
row
,
column
=
0
,
sticky
=
"nw"
)
## l = Label(subframe, text=svalue, justify="l", wraplength=300)
l
=
Entry
(
subframe
,
width
=
0
,
borderwidth
=
0
)
l
.
insert
(
0
,
svalue
)
## l["state"] = "disabled"
l
.
grid
(
row
=
row
,
column
=
1
,
sticky
=
"nw"
)
row
=
row
+
1
self
.
dict
=
dict
# XXX Could we use a <Configure> callback for the following?
subframe
.
update_idletasks
()
# Alas!
width
=
subframe
.
winfo_reqwidth
()
height
=
subframe
.
winfo_reqheight
()
canvas
=
self
.
canvas
self
.
canvas
[
"scrollregion"
]
=
(
0
,
0
,
width
,
height
)
if
height
>
300
:
canvas
[
"height"
]
=
300
frame
.
pack
(
expand
=
1
)
else
:
canvas
[
"height"
]
=
height
frame
.
pack
(
expand
=
0
)
def
close
(
self
):
self
.
frame
.
destroy
()
if
__name__
==
"__main__"
:
root
=
Tk
()
root
.
withdraw
()
StackBrowser
(
root
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment