Pythonで線画ツールを作る

Python/Tkinterで線画ツールを作ります。



スクリーンショット

gui

とりあえずこんな感じでいいんじゃないかなぁ、と。出来るだけシンプルに。
MainLine・・・線の種類です。補助線もあったらいいかなっと思って。
File・・・・・ファイル操作メニュです。開くとか保存とか。
View・・・・・画面操作メニュです。全体表示とか。
Option・・・・設定メニュです。デフォルトの線の太さとか。
後は基本、ショートカットキーもしくは右クリックでポップアップメニュで操作するスタイルに する予定。

ソース

通常のメニューやオプションメニュになんとなく必要そうな項目だけを、ラベルだけ加えました。
メソッドとの関連付けは後ほど。

マウス操作とキーボードのバインディングも空っぽだけど、やり方を忘れないように書きます。

  1. # -*- coding: utf-8 -*-
  2. import tkinter as tk
  3.  
  4. class DrawApp():
  5.  
  6. def __init__(self):
  7. self.window = tk.Tk()
  8. self.set_gui()
  9. self.reset_bind()
  10.  
  11. def mainloop(self):
  12. self.window.mainloop()
  13.  
  14. def set_gui(self):
  15. # canvas
  16. self.canvas = tk.Canvas(self.window, bg="white")
  17. self.canvas.pack(fill=tk.BOTH,expand=True)
  18.  
  19. # bottom menu
  20. self.menu = tk.Frame(self.window)
  21. self.menu.pack(fill=tk.BOTH)
  22.  
  23. # line type menu
  24. LINES = ['MainLine','SubLine','Arrow']
  25. self.line_type = tk.StringVar()
  26. self.line_type.set(LINES[0])
  27. line_menu = tk.OptionMenu(self.menu, self.line_type, *LINES)
  28. line_menu.pack(side=tk.LEFT)
  29.  
  30. # file menu
  31. file_btn = tk.Menubutton(self.menu,text='File')
  32. menu = tk.Menu(file_btn,tearoff=False)
  33. menu.add_command(label='Open...')
  34. menu.add_command(label='Save...')
  35. menu.add_command(label='Import')
  36. menu.add_command(label='Export')
  37. file_btn.configure(menu=menu)
  38. file_btn.pack(side=tk.LEFT)
  39.  
  40. # view menu
  41. view_btn = tk.Menubutton(self.menu,text='View')
  42. menu = tk.Menu(view_btn,tearoff=False)
  43. menu.add_command(label='Zoom')
  44. menu.add_command(label='View All')
  45. menu.add_command(label='Backgraund Image...')
  46. view_btn.configure(menu=menu)
  47. view_btn.pack(side=tk.LEFT)
  48.  
  49. # option menu
  50. option_btn = tk.Menubutton(self.menu,text='Option')
  51. menu = tk.Menu(option_btn,tearoff=False)
  52. menu.add_command(label='Setting')
  53. option_btn.configure(menu=menu)
  54. option_btn.pack(side=tk.LEFT)
  55.  
  56. # message label
  57. self.msg = tk.StringVar()
  58. msg_label = tk.Label(self.menu,textvariable=self.msg,fg='#666666')
  59. msg_label.pack(side=tk.LEFT)
  60.  
  61. self.show_message('App Start!')
  62.  
  63. def show_message(self,message):
  64. self.msg.set(message)
  65.  
  66. def set_bind(self):
  67. self.remove_bind()
  68.  
  69. self.canvas.bind('<ButtonPress-1>', self.on_left_press)
  70. self.canvas.bind('<ButtonPress-2>', self.on_center_press)
  71. self.canvas.bind('<ButtonPress-3>', self.on_right_press)
  72. self.canvas.bind('<Shift-ButtonPress-3>', self.on_right_press)
  73. self.canvas.bind('<B1-Motion>', self.on_left_motion)
  74. self.canvas.bind('<B2-Motion>', self.on_center_motion)
  75. self.canvas.bind('<B3-Motion>', self.on_right_motion)
  76. self.canvas.bind('<ButtonRelease-1>', self.on_left_release)
  77. self.canvas.bind('<ButtonRelease-2>', self.on_center_release)
  78. self.canvas.bind('<ButtonRelease-3>', self.on_right_release)
  79. self.canvas.bind('<Motion>',self.on_motion)
  80. self.window.bind('<KeyPress>',self.on_key_press)
  81. self.window.bind('<Control-KeyPress>',self.on_key_pressCtrl)
  82. self.window.bind('<Alt-KeyPress>',self.on_key_pressAlt)
  83. self.window.bind('<MouseWheel>',self.on_mouse_wheel)
  84.  
  85. def remove_bind(self):
  86. self.canvas.unbind("<ButtonPress-1>")
  87. self.canvas.unbind('<ButtonPress-2>')
  88. self.canvas.unbind('<ButtonPress-3>')
  89. self.canvas.unbind('<B1-Motion>')
  90. self.canvas.unbind('<B2-Motion>')
  91. self.canvas.unbind('<B3-Motion>')
  92. self.canvas.unbind('<ButtonRelease-1>')
  93. self.canvas.unbind('<ButtonRelease-2>')
  94. self.canvas.unbind('<ButtonRelease-3>')
  95. self.window.unbind('<KeyPress>')
  96. self.window.unbind('<KeyRelease>')
  97.  
  98. def on_motion(self,event):
  99. return
  100.  
  101. def on_left_press(self,event):
  102. return
  103.  
  104. def on_left_motion(self,event):
  105. return
  106.  
  107. def on_left_release(self,event):
  108. return
  109.  
  110. def on_right_press(self,event):
  111. return
  112.  
  113. def on_right_motion(self,event):
  114. return
  115.  
  116. def on_right_release(self,event):
  117. return
  118.  
  119. def on_center_press(self,event):
  120. return
  121.  
  122. def on_center_motion(self,event):
  123. return
  124.  
  125. def on_center_release(self,event):
  126. return
  127.  
  128. def on_key_press(self,event):
  129. return
  130.  
  131. def on_key_pressCtrl(self,event):
  132. return
  133.  
  134. def on_key_pressAlt(self,event):
  135. return
  136.  
  137. def on_key_release(self,event):
  138. return
  139.  
  140. def on_mouse_wheel(self,event):
  141. return
  142.  
  143.  
  144. def main():
  145. app = DrawApp()
  146. app.mainloop()
  147.  
  148.  
  149. if __name__ == '__main__':
  150. main()
ページトップへ