2013-12-18 4 views
0

Я научился использовать wxPython для создания диалоговой программы.Как использовать wxPython для создания диалогового окна?

Я попытался следующий код (просто скопированный из WxPython Demo):

import wx 

#--------------------------------------------------------------------------- 

class TestPanel(wx.Panel): 
    def __init__(self, parent, log): 
     self.log = log 
     wx.Panel.__init__(self, parent, -1) 

     b = wx.Button(self, -1, "Create and Show a DirDialog", (50,50)) 
     self.Bind(wx.EVT_BUTTON, self.OnButton, b) 


    def OnButton(self, evt): 
     # In this case we include a "New directory" button. 
     dlg = wx.DirDialog(self, "Choose a directory:", 
          style=wx.DD_DEFAULT_STYLE 
          #| wx.DD_DIR_MUST_EXIST 
          #| wx.DD_CHANGE_DIR 
          ) 

     # If the user selects OK, then we process the dialog's data. 
     # This is done by getting the path data from the dialog - BEFORE 
     # we destroy it. 
     if dlg.ShowModal() == wx.ID_OK: 
      self.log.WriteText('You selected: %s\n' % dlg.GetPath()) 

     # Only destroy a dialog after you're done with it. 
     dlg.Destroy() 


#--------------------------------------------------------------------------- 


def runTest(frame, nb, log): 
    win = TestPanel(nb, log) 
    return win 


#--------------------------------------------------------------------------- 




overview = """\ 
This class represents the directory chooser dialog. It is used when all you 
need from the user is the name of a directory. Data is retrieved via utility 
methods; see the <code>DirDialog</code> documentation for specifics. 
""" 


if __name__ == '__main__': 
    import sys,os 
    import run 
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) 

Я выбежала выше кода, как в Python IDLE и Apatana Studio 3. Вот что я получил.

В Python IDLE, у меня есть:

IDLE Subprocess: no IP port passed in sys.argv.

И в Apatana Studio 3, у меня есть:

Traceback (most recent call last):
File "C:\Users\User\My Documents\Aptana Studio 3 Workspace\Test Dialogue\main.py", line 61, in import run ImportError: No module named run

Могу ли я знать, что я не прав? Большое спасибо. :)

ответ

1

ImportError - это интерпретатор Python (программа, которая запускает ваш код на Python), давая вам знать, что он не может найти модуль (.py-файл), который вы пытаетесь импортировать. В частности, ошибка говорит о том, что он не может найти модуль «run», который вы попросили его импортировать в строке 61.

Когда вы выполняете импорт в Python, интерпретатор ищет кучу мест для модуля. Один из них - текущий каталог, а остальные - стандартные места, например, где установлены библиотеки Python. На этой странице есть информация о нем: http://docs.python.org/2/tutorial/modules.html#the-module-search-path. Фактически вы получите тот же ImportError, если вы запустите программу из командной строки. Это ошибка Python, а не ошибка Apatana Studio 3.

Итак, если вы скопируете «run.py» в каталог с вашим файлом Python, интерпретатор Python сможет легко найти его, когда вы попросите его импортировать. Другой способ - оставить модуль run.py там, где он есть, и изменить sys.path во время выполнения или добавить расположение модуля в переменную PYTHONPATH (см. Ссылку выше для получения дополнительной информации).

Модуль run.py не нужен для того, чего вы пытаетесь достичь. Ниже приведен пример вашего кода без импортируемого модуля run.py. Я предупреждаю, что я новичок в WxPython себя, так что могут быть более эффективными способами сделать это ;-)

import wx 

# This Log class is copied from the run module 
class Log(object): 
    def WriteText(self, text): 
     if text[-1:] == '\n': 
      text = text[:-1] 
     wx.LogMessage(text) 
    write = WriteText 


class TestPanel(wx.Panel): 
    def __init__(self, parent, log): 
     self.log = Log() 
     wx.Panel.__init__(self, parent, -1) 

     b = wx.Button(self, -1, "Create and Show a DirDialog", (50,50)) 
     self.Bind(wx.EVT_BUTTON, self.OnButton, b) 


    def OnButton(self, evt): 
     # In this case we include a "New directory" button. 
     dlg = wx.DirDialog(self, "Choose a directory:", 
          style=wx.DD_DEFAULT_STYLE 
          #| wx.DD_DIR_MUST_EXIST 
          #| wx.DD_CHANGE_DIR 
          ) 

     # If the user selects OK, then we process the dialog's data. 
     # This is done by getting the path data from the dialog - BEFORE 
     # we destroy it. 
     if dlg.ShowModal() == wx.ID_OK: 
      self.log.WriteText('You selected: %s\n' % dlg.GetPath()) 

     # Only destroy a dialog after you're done with it. 
     dlg.Destroy() 


class Frame (wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size(300, 150)) 

     panel = TestPanel(self, -1) 



class App(wx.App): 

    def OnInit(self): 
     self.frame = Frame(parent=None) 
     self.frame.Show() 
     self.SetTopWindow(self.frame) 
     return True 

if __name__ == '__main__': 
    app = App() 
    app.MainLoop() 

Я не уверен, что хотя происходит с ошибкой в ​​IDLE. Это странно!

+0

Привет, Бен. Большое спасибо за очень подробный ответ. Это действительно полезно. Если я могу задать еще один вопрос: что такое 'log' в конструкторе класса' TestPanel'? Когда я запускаю код, после выбора каталога появляется следующее сообщение: «Traceback (последний последний вызов): Файл« P/Project Backups/Python Practice/Examples/Demo_Panel2.py », строка 25, в OnButton self.log.WriteText ('Вы выбрали:'% dlg.GetPath()) AttributeError: объект 'int' не имеет атрибута 'WriteText' '. Я думаю, что эта ошибка указывает на «журнал». Большое спасибо. – ChangeMyName

+0

Этот код скопирован из демонстрационного кода wxpython для DirDialog. Журнал используется для отображения вывода в демо. Вы можете прокомментировать любые ссылки на журнал. – Yoriz

+0

Отличное слежение! Модуль run.py также содержал класс журнала, который показывал вам выбранный вами выбор. Как сказал Йориз, вы можете просто удалить ссылки на журнал. Я решил добавить класс журнала в примерный код выше, чтобы вы могли видеть, как это может вписаться. Он скопирован из run.py, но я изменил класс как класс «нового стиля», а не старый (см. Http://stackoverflow.com/questions/54867/old-style-and-new-style-classes- in-python) и изменил строку в TestPanel из self.log = log to self.log = Log() – Ben

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