2009-09-03 2 views
4

В настоящее время я изучаю Python с помощью вводного текста Zelle, и я пытаюсь воссоздать одну из примеров программ, в которой используется прилагаемый файл graphics.py. Поскольку я использую Python 3.1, и текст был написан для 2.x, я использую файл GraphicsPy3.py, найденный по адресу http://mcsp.wartburg.edu/zelle/python и переименовав его на моем компьютере.Начальная графическая программа в Python, дающая ошибку «из пространства стека»

файл с именем futval_graph.py выглядит следующим образом:

from graphics import * 

def main(): 
    print("This program plots the growth of a 10-year investment.") 

    principal = eval(input("Enter the initial principal: ")) 
    apr = eval(input("Enter the annualized interest rate: ")) 

    win = GraphWin("Investment Grown Chart", 320, 420) 
    win.setBackground("white") 
    Text(Point(20, 230), ' 0.0K').draw(win) 
    Text(Point(20, 180), ' 2.5K').draw(win) 
    Text(Point(20, 130), ' 5.0K').draw(win) 
    Text(Point(20, 80), ' 7.5K').draw(win) 
    Text(Point(20, 30), '10.0K').draw(win) 

    # Rest of code is here but I've commented it out to isolate the problem. 

main() 

Когда я бег «импорт futval_graph» на свежую сессии IDLE программа просто работает, а затем вешает после inputing «» апр без открытия новой графики окно. При запуске программы из командной строки я получаю следующий результат:

C: \ Python31> futval_graph.py
Эта программа показывает зависимость роста инвестиций в 10 лет.
Введите начальный принципала: ошибка в фоновом режиме обработчика ошибок:
из стека (? Бесконечный цикл)
при выполнении
«:: TCL :: Bgerror {(? Бесконечная петля) из стека} {- код 1 -уровень 0 -errorco де NONE -errorinfo {из стека (бесконечный цикл?)
в то время как execu ...»

Особенно расстраивает тот факт, что эта последовательность команд работает при вводе в свежая сессия IDLE. А затем при запуске 'import futval_graph' из IDLE после того, как все команды были запущены самостоятельно, futval_graph работает правильно.

Итак, мой вопрос: как я могу получить futval_graph.py для правильной работы как из командной строки, так и из IDLE? Извините, если мое объяснение проблемы немного разбросано. Дайте мне знать, если какая-либо дополнительная информация поможет уточнить.

+1

Что вы туда вводите? на первой строке ввода? вторая линия никогда не появляется. – SilentGhost

+0

Обычно я просто вводил номер 2000, хотя теоретически любой номер должен работать. – IanWhalen

+0

только точка стиля: используйте «int» not «eval» –

ответ

2

Появляется проблема с Python 3 для версии graphics.py.

Я загрузил версию Python 3, переименовал ее в graphics.py, затем выполнил следующее.

PS C:\Users\jaraco\Desktop> python 
Python 3.1.1 (r311:74483, Aug 17 2009, 17:02:12) [MSC v.1500 32 bit (Intel)] on 
win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from graphics import * 
>>> dir() 
['BAD_OPTION', 'Circle', 'DEAD_THREAD', 'DEFAULT_CONFIG', 'Entry', 'GraphWin', 'GraphicsError', 'GraphicsObject', 'Image', 'Line', 'OBJ_ALREADY_DRAWN', 'Oval', 
'Pixmap', 'Point', 'Polygon', 'Queue', 'Rectangle', 'Text', 'Transform', 'UNSUPPORTED_METHOD', '\_\_builtins\_\_', '\_\_doc\_\_', '\_\_name\_\_', '\_\_package\_\_', 'atexit', 'color_rgb', 'copy', 'os', 'sys', 'test', 'time', 'tk'] 
>>> error in background error handler: 
out of stack space (infinite loop?) 
    while executing 
"::tcl::Bgerror {out of stack space (infinite loop?)} {-code 1 -level 0 -errorcode NONE -errorinfo {out of stack space (infinite loop?) 
    while execu..." 

Как вы можете видеть, я получаю ту же ошибку, и я даже ничего не выполнил в модуле. Кажется, что проблема связана с самой библиотекой, а не с тем, что вы делаете в своем коде.

Я бы сообщил об этом автору, как он предлагает.

Я обнаружил, что не получил ошибку, если я просто импортировал графический модуль.

>>> import graphics 
>>> dir(graphics) 

Я обнаружил, что если бы я сделал это в код, а затем изменили ссылки на GraphWin graphics.GraphWin, Текст к graphics.Text и Поинт graphics.Point, проблема, казалось, чтобы уйти, и я может запустить его из командной строки.

import graphics 

def main(): 
    print("This program plots the growth of a 10-year investment.") 

    principal = eval(input("Enter the initial principal: ")) 
    apr = eval(input("Enter the annualized interest rate: ")) 

    win = graphics.GraphWin("Investment Grown Chart", 320, 420) 
    win.setBackground("white") 
    graphics.Text(graphics.Point(20, 230), ' 0.0K').draw(win) 
    graphics.Text(graphics.Point(20, 180), ' 2.5K').draw(win) 
    graphics.Text(graphics.Point(20, 130), ' 5.0K').draw(win) 
    graphics.Text(graphics.Point(20, 80), ' 7.5K').draw(win) 
    graphics.Text(graphics.Point(20, 30), '10.0K').draw(win) 

    # Rest of code is here but I've commented it out to isolate the problem. 

main() 

Зачем это должно быть? Это не должно. Похоже, что модуль graphics.py имеет некоторый побочный эффект, который не ведет себя правильно.

Я подозреваю, что вы не столкнетесь с этими ошибками в версии Python 2.x.

+0

После дополнительного созерцания я подозреваю причину, по которой он работает в IDLE, а не в командной строке, потому что, когда вы запускаете из IDLE, IDLE уже инициализировал набор инструментов для окон, но когда вы запускаете из командной строки, модуль graphics.py инициализирует набор инструментов, но, возможно, не совсем правильно. –

+0

Джейсон, спасибо за обходной путь. Полагаю, я действительно передам это автору. – IanWhalen

+0

На самом деле, я боюсь, что обходной путь не совсем сработал, как я думал. Чтобы быть уверенным, я обновился с 3.1 до 3.1.1, но выполнил 'from graphics import *', а затем 'dir()' не дал мне никакого сообщения об ошибке. Аналогичным образом, подрыв в «графике». там, где это необходимо, тоже не решила проблему. Теперь я, вероятно, собираюсь на DL python 2.6.2, чтобы узнать, работает ли он там, и если так продолжайте работать в этой версии. – IanWhalen

1

ваш код имеет проблемы с buil-in input, когда он вызывается с непустой строкой в ​​качестве аргумента. Я подозреваю, что это может иметь какое-то отношение к настройке потока, которую делает graphics.

Если вы делаете виджеты Tkinter для чтения этих входов, возможно, это решит вашу проблему.

Честно говоря, когда вы загружаете graphicsPy3.py он говорит:

Графическая библиотека портирована на Python 3.x. Все еще экспериментально, пожалуйста, сообщите о любых проблемах.

так, я полагаю, вам лучше следовать этой рекомендации.

0

После некоторых дополнительных исследований выяснилось, что вызов функции ввода() оказывает некоторое влияние на запуск нежелательного поведения.

Я переписал программу, чтобы не импортировать графический модуль до тех пор, пока вызовы ввода() не будут завершены. В этом случае я не смог воспроизвести ошибку, и код, казалось, вел себя нормально даже при запуске из командной строки. Я смог получить параметры от пользователя, тогда он начнет рисовать график (хотя с образцом кода только очень мало было сделано до закрытия приложения). Возможно, этот метод является подходящим решением для вашей проблемы.

Основная проблема, похоже, связана с тем, как инициализируется модуль tkinter в отдельном потоке и некоторые нежелательные взаимодействия между потоками. Я предполагаю, что метод input() при запуске из командной строки либо блокирует ресурс, либо иным образом вызывает поведение, приводящее к тому, что поток Tk переходит в бесконечный цикл.

Выполнение некоторых поисковых запросов в Интернете, я вижу, что другие пользователи получили ту же ошибку, но по другим причинам. Некоторые получали его, когда tkinter был построен без поддержки потоков, но я не думаю, что это применимо здесь.

Смежные вопросы