fork download
  1. #!/usr/bin/env python3
  2. # -*- coding: UTF-8 -*-
  3. #
  4. # generated by wxGlade 1.0.4 on Tue Apr 25 11:49:17 2023
  5. #
  6.  
  7. import wx
  8.  
  9. # begin wxGlade: dependencies
  10. # end wxGlade
  11.  
  12. # begin wxGlade: extracode
  13. from pubsub import pub
  14. from simple_database import Env, install_package, interp
  15. import sys
  16.  
  17. class Controller(object):
  18. def __init__(self):
  19. pub.subscribe(self.read, "Controller")
  20. self.table = {"OnNewFile": "new_file",
  21. "OnOpen": "open_file",
  22. "OnSaveFile": "save_file",
  23. "OnSaveFileAs": "save_file_as",
  24. "OnQuit": "quit",
  25. "OnAddCD": "insert_value",
  26. "Delete": "delete"}
  27. def read(self, x, env):
  28. pub.sendMessage("Model.eval",
  29. x = [self.table[x[0]]] + x[1:],
  30. env = env)
  31.  
  32. class Model(object):
  33. def __init__(self):
  34. pub.subscribe(self.eval, "Model")
  35. def eval(self, x, env):
  36. pub.sendMessage("View.SetProperties", env = interp(x, env))
  37. def OnNewFile(self):
  38. with NewFile(self) as fileDialog:
  39. if fileDialog.ShowModal() == wx.ID_CANCEL:
  40. return
  41. pub.sendMessage("Controller.read",
  42. x = ["OnNewFile", fileDialog.GetPath()],
  43. env = self.env)
  44. def OnOpen(self):
  45. with OpenFile(self) as fileDialog:
  46. if fileDialog.ShowModal() == wx.ID_CANCEL:
  47. return
  48. pub.sendMessage("Controller.read",
  49. x = ["OnOpen", fileDialog.GetPath()],
  50. env = self.env)
  51. def OnSaveFileAs(self):
  52. with SaveFileAs(self) as fileDialog:
  53. if fileDialog.ShowModal() == wx.ID_CANCEL:
  54. return
  55. pub.sendMessage("Controller.read",
  56. x = ["OnSaveFileAs", fileDialog.GetPath()],
  57. env = self.env)
  58. # end wxGlade
  59.  
  60.  
  61. class View(wx.Frame):
  62. def __init__(self, *args, **kwds):
  63. # begin wxGlade: View.__init__
  64. self.env = Env(install_package())
  65. kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
  66. wx.Frame.__init__(self, *args, **kwds)
  67. self.SetSize((400, 300))
  68. self.SetTitle("Simple Database")
  69.  
  70. # Menu Bar
  71. self.frame_menubar = wx.MenuBar()
  72. wxglade_tmp_menu = wx.Menu()
  73. item = wxglade_tmp_menu.Append(wx.ID_ANY, u"新規作成\tCtrl+N", "")
  74. self.Bind(wx.EVT_MENU, lambda event: OnNewFile(self), item)
  75. item = wxglade_tmp_menu.Append(wx.ID_ANY, u"開く...\tCtrl+O", "")
  76. self.Bind(wx.EVT_MENU, lambda event: OnOpen(self), item)
  77. item = wxglade_tmp_menu.Append(wx.ID_ANY, u"保存\tCtrl+S", "")
  78. self.Bind(wx.EVT_MENU, lambda event: pub.sendMessage('Controller.read', x = ['OnSaveFile'], env = self.env), item)
  79. item = wxglade_tmp_menu.Append(wx.ID_ANY, u"名前を付けて保存...\tShift+Ctrl+S", "")
  80. self.Bind(wx.EVT_MENU, lambda event: OnSaveAs(self), item)
  81. item = wxglade_tmp_menu.Append(wx.ID_ANY, "Quit\tCtrl+Q", "")
  82. self.Bind(wx.EVT_MENU, lambda event: pub.sendMessage('Controller.read', x = ['OnQuit'], env = self.env), item)
  83. self.frame_menubar.Append(wxglade_tmp_menu, u"ファイル")
  84. self.SetMenuBar(self.frame_menubar)
  85. # Menu Bar end
  86.  
  87. sizer_1 = wx.BoxSizer(wx.VERTICAL)
  88.  
  89. self.AddCD = wx.Button(self, wx.ID_ANY, "AddCD")
  90. sizer_1.Add(self.AddCD, 0, 0, 0)
  91.  
  92. self.list_ctrl_1 = wx.ListCtrl(self, wx.ID_ANY, style=wx.LC_HRULES | wx.LC_REPORT | wx.LC_VRULES)
  93. self.list_ctrl_1.AppendColumn(u"タイトル", format=wx.LIST_FORMAT_LEFT, width=-1)
  94. self.list_ctrl_1.AppendColumn(u"アーティスト", format=wx.LIST_FORMAT_LEFT, width=-1)
  95. self.list_ctrl_1.AppendColumn(u"レーティング", format=wx.LIST_FORMAT_LEFT, width=-1)
  96. self.list_ctrl_1.AppendColumn(u"リップ", format=wx.LIST_FORMAT_LEFT, width=-1)
  97. sizer_1.Add(self.list_ctrl_1, 1, wx.EXPAND, 0)
  98.  
  99. self.SetSizer(sizer_1)
  100.  
  101. self.Layout()
  102. pub.subscribe(self.SetProperties, 'View')
  103.  
  104. self.Bind(wx.EVT_BUTTON, lambda event: AddCDDialog(self).ShowModal(), self.AddCD)
  105. self.Bind(wx.EVT_LIST_ITEM_RIGHT_CLICK, self.rclick, self.list_ctrl_1)
  106. # end wxGlade
  107.  
  108. # SetProperies メソッドを追加
  109. def SetProperties(self, env):
  110. self.env = env
  111. self.list_ctrl_1.DeleteAllItems() # ここで一旦表示を全消去する
  112. [[self.list_ctrl_1.InsertItem(sys.maxsize, obj) if col == 0
  113. else self.list_ctrl_1.SetItem(index, col, obj) for col, obj
  114. in enumerate([item.title, item.artist, item.rating, item.ripped])]
  115. for index, item in enumerate(self.env.ls)]
  116.  
  117. def rclick(self, event): # wxGlade: View.<event_handler>
  118. ## print("Event handler 'rclick' not implemented!")
  119. ## event.Skip()
  120. ## 上の自動生成部分二行をコメントアウトして以下を追加する
  121. menu_file = wx.Menu() # メニューを定義
  122. item = wx.MenuItem(menu_file, 1, '削除') # メニューの選択肢を定義
  123. menu_file.Append(item) # 選択肢をメニューに仕込む
  124. menu_file.Bind(wx.EVT_MENU, self.menu_select) # メニューのイベントハンドラとして menu_select を使用
  125. wx.Window.PopupMenu(self, menu_file, event.GetPoint()) # ポップアップを生成
  126.  
  127. # menu_select メソッドを追加
  128. def menu_select(self, event):
  129. id = event.GetId() # 選択肢番号を取得
  130. if id == 1:
  131. pub.sendMessage('Controller.read',
  132. x = ['Delete',
  133. str(self.list_ctrl_1.GetFocusedItem())],
  134. env = self.env)
  135.  
  136. # end of class View
  137.  
  138. class AddCDDialog(wx.Dialog):
  139. def __init__(self, *args, **kwds):
  140. # begin wxGlade: AddCDDialog.__init__
  141. self.env = args[0].env
  142. kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE
  143. wx.Dialog.__init__(self, *args, **kwds)
  144. self.SetTitle("Add CD")
  145.  
  146. sizer_1 = wx.BoxSizer(wx.VERTICAL)
  147.  
  148. grid_sizer_1 = wx.GridSizer(4, 2, 0, 0)
  149. sizer_1.Add(grid_sizer_1, 1, wx.EXPAND, 0)
  150.  
  151. Title = wx.StaticText(self, wx.ID_ANY, u"タイトル")
  152. grid_sizer_1.Add(Title, 0, wx.ALIGN_CENTER, 0)
  153.  
  154. self.text_ctrl_1 = wx.TextCtrl(self, wx.ID_ANY, "")
  155. grid_sizer_1.Add(self.text_ctrl_1, 0, wx.ALIGN_CENTER, 0)
  156.  
  157. Artist = wx.StaticText(self, wx.ID_ANY, u"アーティスト")
  158. grid_sizer_1.Add(Artist, 0, wx.ALIGN_CENTER, 0)
  159.  
  160. self.text_ctrl_2 = wx.TextCtrl(self, wx.ID_ANY, "")
  161. grid_sizer_1.Add(self.text_ctrl_2, 0, wx.ALIGN_CENTER, 0)
  162.  
  163. Rating = wx.StaticText(self, wx.ID_ANY, u"レーティング")
  164. grid_sizer_1.Add(Rating, 0, wx.ALIGN_CENTER, 0)
  165.  
  166. self.text_ctrl_3 = wx.TextCtrl(self, wx.ID_ANY, "")
  167. grid_sizer_1.Add(self.text_ctrl_3, 0, wx.ALIGN_CENTER, 0)
  168.  
  169. Ripped = wx.StaticText(self, wx.ID_ANY, u"リップ")
  170. grid_sizer_1.Add(Ripped, 0, wx.ALIGN_CENTER, 0)
  171.  
  172. self.text_ctrl_4 = wx.TextCtrl(self, wx.ID_ANY, "")
  173. grid_sizer_1.Add(self.text_ctrl_4, 0, wx.ALIGN_CENTER, 0)
  174.  
  175. sizer_2 = wx.StdDialogButtonSizer()
  176. sizer_1.Add(sizer_2, 0, wx.ALIGN_RIGHT | wx.ALL, 4)
  177.  
  178. self.button_OK = wx.Button(self, wx.ID_OK, "")
  179. self.button_OK.SetDefault()
  180. sizer_2.AddButton(self.button_OK)
  181.  
  182. self.button_CANCEL = wx.Button(self, wx.ID_CANCEL, "")
  183. sizer_2.AddButton(self.button_CANCEL)
  184.  
  185. sizer_2.Realize()
  186.  
  187. self.SetSizer(sizer_1)
  188. sizer_1.Fit(self)
  189.  
  190. self.SetAffirmativeId(self.button_OK.GetId())
  191. self.SetEscapeId(self.button_CANCEL.GetId())
  192.  
  193. self.Layout()
  194.  
  195. self.Bind(wx.EVT_BUTTON, lambda event: self.OnAddCD(), self.button_OK)
  196. self.Bind(wx.EVT_BUTTON, lambda event: self.Destroy(), self.button_CANCEL)
  197. # end wxGlade
  198.  
  199. # OnAddCD メソッドを追加
  200. def OnAddCD(self):
  201. pub.sendMessage('Controller.read',
  202. x = ['OnAddCD',
  203. self.text_ctrl_1.GetLineText(0),
  204. self.text_ctrl_2.GetLineText(0),
  205. self.text_ctrl_3.GetLineText(0),
  206. self.text_ctrl_4.GetLineText(0)],
  207. env = self.env)
  208. self.Destroy()
  209.  
  210. # end of class AddCDDialog
  211.  
  212. ##class NewFile(wx.Dialog): ここを修正
  213. class NewFile(wx.FileDialog):
  214. def __init__(self, *args, **kwds):
  215. # begin wxGlade: NewFile.__init__
  216. self.env = args[0].env
  217. ## 次の二行を修正
  218. ## kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE
  219. ## wx.Dialog.__init__(self, *args, **kwds)
  220. kwds["style"] = kwds.get("style", 0) | wx.FD_SAVE
  221. wx.FileDialog.__init__(self, *args, **kwds)
  222. self.SetTitle(u"新規作成")
  223. self.Layout()
  224. # end wxGlade
  225.  
  226. # end of class NewFile
  227.  
  228. ##class OpenFile(wx.Dialog): ここを修正
  229. class OpenFile(wx.FileDialog):
  230. def __init__(self, *args, **kwds):
  231. # begin wxGlade: OpenFile.__init__
  232. self.env = args[0].env
  233. ## 次の二行を修正
  234. ## kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE
  235. ## wx.Dialog.__init__(self, *args, **kwds)
  236. kwds["style"] = kwds.get("style", 0) | wx.FD_OPEN
  237. wx.FileDialog.__init__(self, *args, **kwds)
  238. self.SetTitle(u"開く...")
  239. self.Layout()
  240. # end wxGlade
  241.  
  242. # end of class OpenFile
  243.  
  244. ##class SaveFileAs(wx.Dialog): ここを修正
  245. class SaveFileAs(wx.FileDialog):
  246. def __init__(self, *args, **kwds):
  247. # begin wxGlade: SaveFileAs.__init__
  248. self.env = args[0].env
  249. ## 次の二行を修正
  250. ## kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_DIALOG_STYLE
  251. ## wx.Dialog.__init__(self, *args, **kwds)
  252. kwds["style"] = kwds.get("style", 0) | wx.FD_SAVE
  253. wx.FileDialog.__init__(self, *args, **kwds)
  254. self.SetTitle(u"名前を付けて保存...")
  255. self.Layout()
  256. # end wxGlade
  257.  
  258. # end of class SaveFileAs
  259.  
  260. class SimpleDatabase(wx.App):
  261. def OnInit(self):
  262. self.View = View(None, wx.ID_ANY, "")
  263. self.SetTopWindow(self.View)
  264. self.View.Show()
  265. return True
  266.  
  267. # end of class SimpleDatabase
  268.  
  269. if __name__ == "__main__":
  270. m = Model() # 追加: Model
  271. SimpleDatabase = SimpleDatabase(0) # View
  272. c = Controller() # 追加: Controller
  273. SimpleDatabase.MainLoop()
  274.  
Runtime error #stdin #stdout #stderr 0.15s 26132KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "./prog.py", line 7, in <module>
ModuleNotFoundError: No module named 'wx'