การประยุกต์ใช้แนวคิดเชิงวัตถุ
Object-Oriented Programming
จุดประสงค์
เขียนคำสั่งเพื่อใช้ชุดคำสั่งเสริมที่อิงแนวคิดเชิงวัตถุได้
Desktop Applications
ภาษา Python สามารถนำไปพัฒนาโปรแกรมบนเครื่องคอมพิวเตอร์ได้โดยสามารถเลือกใช้ชุดคำสั่งเสริมต่อไปนี้ได้
PyQt
1import sys
2from PyQt5.QtWidgets import QApplication, QWidget
3from PyQt5.QtGui import QIcon
4
5
6class Example(QWidget):
7
8 def __init__(self):
9 super().__init__()
10
11 self.initUI()
12
13
14 def initUI(self):
15
16 self.setGeometry(300, 300, 300, 220)
17 self.setWindowTitle('Icon')
18 self.setWindowIcon(QIcon('web.png'))
19
20 self.show()
21
22
23if __name__ == '__main__':
24
25 app = QApplication(sys.argv)
26 ex = Example()
27 sys.exit(app.exec_())
1# original source : https://github.com/pyqt/examples/blob/_/src/02%20PyQt%20Widgets/main.py
2
3from PyQt5.QtCore import QDateTime, Qt, QTimer
4from PyQt5.QtWidgets import *
5
6text = '''สิงโตตัวหนึ่งได้ยินเสียงร้องดังกังวานมาแต่ไกล\n
7มันคิดว่าเจ้าของเสียงนั้นต้องเป็นสัตว์ใหญ่และน่าเกรงขามกว่าตัวมันแน่\n
8มันสอดสายตาเดินตามหาที่มาของเสียงนั้น\n
9จนถึงริมน้ำแห่งหนึ่งมันจึงพบว่า\n
10แท้จริงแล้วเจ้าของเสียงนั้นคือกบตัวหนึ่งที่อาศัยอยู่ริมน้ำนี่เอง\n
11เจ้าสิงโตโกรธจัดตรงเข้าไปใช้อุ้งเท้าเหยียบจนกบแบนติดพื้น\n
12แล้วพูดว่า "ทำไงได้ล่ะ! ก็เจ้าอยากมีเสียงที่ใหญ่เกินตัวของเจ้านี่เอง"'''
13
14class WidgetGallery(QDialog):
15
16 def __init__(self, parent=None):
17 super(WidgetGallery, self).__init__(parent)
18
19 self.originalPalette = QApplication.palette()
20
21 styleComboBox = QComboBox()
22 styleComboBox.addItems(QStyleFactory.keys())
23
24 styleLabel = QLabel("&Style:")
25 styleLabel.setBuddy(styleComboBox)
26
27 self.useStylePaletteCheckBox = QCheckBox("&Use style's standard palette")
28 self.useStylePaletteCheckBox.setChecked(True)
29
30 disableWidgetsCheckBox = QCheckBox("&Disable widgets")
31
32 self.createTopLeftGroupBox()
33 self.createTopRightGroupBox()
34 self.createBottomLeftTabWidget()
35 self.createBottomRightGroupBox()
36 self.createProgressBar()
37
38 styleComboBox.activated[str].connect(self.changeStyle)
39 self.useStylePaletteCheckBox.toggled.connect(self.changePalette)
40 disableWidgetsCheckBox.toggled.connect(self.topLeftGroupBox.setDisabled)
41 disableWidgetsCheckBox.toggled.connect(self.topRightGroupBox.setDisabled)
42 disableWidgetsCheckBox.toggled.connect(self.bottomLeftTabWidget.setDisabled)
43 disableWidgetsCheckBox.toggled.connect(self.bottomRightGroupBox.setDisabled)
44
45 topLayout = QHBoxLayout()
46 topLayout.addWidget(styleLabel)
47 topLayout.addWidget(styleComboBox)
48 topLayout.addStretch(1)
49 topLayout.addWidget(self.useStylePaletteCheckBox)
50 topLayout.addWidget(disableWidgetsCheckBox)
51
52 mainLayout = QGridLayout()
53 mainLayout.addLayout(topLayout, 0, 0, 1, 2)
54 mainLayout.addWidget(self.topLeftGroupBox, 1, 0)
55 mainLayout.addWidget(self.topRightGroupBox, 1, 1)
56 mainLayout.addWidget(self.bottomLeftTabWidget, 2, 0)
57 mainLayout.addWidget(self.bottomRightGroupBox, 2, 1)
58 mainLayout.addWidget(self.progressBar, 3, 0, 1, 2)
59 mainLayout.setRowStretch(1, 1)
60 mainLayout.setRowStretch(2, 1)
61 mainLayout.setColumnStretch(0, 1)
62 mainLayout.setColumnStretch(1, 1)
63 self.setLayout(mainLayout)
64
65 self.setWindowTitle("Styles")
66 self.changeStyle('Windows')
67
68 def changeStyle(self, styleName):
69 QApplication.setStyle(QStyleFactory.create(styleName))
70 self.changePalette()
71
72 def changePalette(self):
73 if (self.useStylePaletteCheckBox.isChecked()):
74 QApplication.setPalette(QApplication.style().standardPalette())
75 else:
76 QApplication.setPalette(self.originalPalette)
77
78 def advanceProgressBar(self):
79 curVal = self.progressBar.value()
80 maxVal = self.progressBar.maximum()
81 self.progressBar.setValue(curVal + (maxVal - curVal) / 100)
82
83 def createTopLeftGroupBox(self):
84 self.topLeftGroupBox = QGroupBox("Group 1")
85
86 radioButton1 = QRadioButton("Radio button 1")
87 radioButton2 = QRadioButton("Radio button 2")
88 radioButton3 = QRadioButton("Radio button 3")
89 radioButton1.setChecked(True)
90
91 checkBox = QCheckBox("Tri-state check box")
92 checkBox.setTristate(True)
93 checkBox.setCheckState(Qt.PartiallyChecked)
94
95 layout = QVBoxLayout()
96 layout.addWidget(radioButton1)
97 layout.addWidget(radioButton2)
98 layout.addWidget(radioButton3)
99 layout.addWidget(checkBox)
100 layout.addStretch(1)
101 self.topLeftGroupBox.setLayout(layout)
102
103 def createTopRightGroupBox(self):
104 self.topRightGroupBox = QGroupBox("Group 2")
105
106 defaultPushButton = QPushButton("Default Push Button")
107 defaultPushButton.setDefault(True)
108
109 togglePushButton = QPushButton("Toggle Push Button")
110 togglePushButton.setCheckable(True)
111 togglePushButton.setChecked(True)
112
113 flatPushButton = QPushButton("Flat Push Button")
114 flatPushButton.setFlat(True)
115
116 layout = QVBoxLayout()
117 layout.addWidget(defaultPushButton)
118 layout.addWidget(togglePushButton)
119 layout.addWidget(flatPushButton)
120 layout.addStretch(1)
121 self.topRightGroupBox.setLayout(layout)
122
123 def createBottomLeftTabWidget(self):
124 self.bottomLeftTabWidget = QTabWidget()
125 self.bottomLeftTabWidget.setSizePolicy(QSizePolicy.Preferred,
126 QSizePolicy.Ignored)
127
128 tab1 = QWidget()
129 tableWidget = QTableWidget(10, 10)
130
131 tab1hbox = QHBoxLayout()
132 tab1hbox.setContentsMargins(5, 5, 5, 5)
133 tab1hbox.addWidget(tableWidget)
134 tab1.setLayout(tab1hbox)
135
136 tab2 = QWidget()
137 textEdit = QTextEdit()
138
139 textEdit.setPlainText(text)
140
141 tab2hbox = QHBoxLayout()
142 tab2hbox.setContentsMargins(5, 5, 5, 5)
143 tab2hbox.addWidget(textEdit)
144 tab2.setLayout(tab2hbox)
145
146 self.bottomLeftTabWidget.addTab(tab1, "&Table")
147 self.bottomLeftTabWidget.addTab(tab2, "Text &Edit")
148
149 def createBottomRightGroupBox(self):
150 self.bottomRightGroupBox = QGroupBox("Group 3")
151 self.bottomRightGroupBox.setCheckable(True)
152 self.bottomRightGroupBox.setChecked(True)
153
154 lineEdit = QLineEdit('s3cRe7')
155 lineEdit.setEchoMode(QLineEdit.Password)
156
157 spinBox = QSpinBox(self.bottomRightGroupBox)
158 spinBox.setValue(50)
159
160 dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox)
161 dateTimeEdit.setDateTime(QDateTime.currentDateTime())
162
163 slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox)
164 slider.setValue(40)
165
166 scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox)
167 scrollBar.setValue(60)
168
169 dial = QDial(self.bottomRightGroupBox)
170 dial.setValue(30)
171 dial.setNotchesVisible(True)
172
173 layout = QGridLayout()
174 layout.addWidget(lineEdit, 0, 0, 1, 2)
175 layout.addWidget(spinBox, 1, 0, 1, 2)
176 layout.addWidget(dateTimeEdit, 2, 0, 1, 2)
177 layout.addWidget(slider, 3, 0)
178 layout.addWidget(scrollBar, 4, 0)
179 layout.addWidget(dial, 3, 1, 2, 1)
180 layout.setRowStretch(5, 1)
181 self.bottomRightGroupBox.setLayout(layout)
182
183 def createProgressBar(self):
184 self.progressBar = QProgressBar()
185 self.progressBar.setRange(0, 10000)
186 self.progressBar.setValue(0)
187
188 timer = QTimer(self)
189 timer.timeout.connect(self.advanceProgressBar)
190 timer.start(1000)
191
192
193if __name__ == '__main__':
194
195 import sys
196
197 app = QApplication(sys.argv)
198 gallery = WidgetGallery()
199 gallery.show()
200 sys.exit(app.exec_())
201
Kivy
1import kivy
2kivy.require('1.0.7')
3
4from kivy.animation import Animation
5from kivy.app import App
6from kivy.uix.button import Button
7
8
9class TestApp(App):
10
11 def animate(self, instance):
12 animation = Animation(pos=(100, 100), t='out_bounce')
13 animation += Animation(pos=(200, 100), t='out_bounce')
14 animation &= Animation(size=(500, 500))
15 animation += Animation(size=(100, 50))
16
17 animation.start(instance)
18
19 def build(self):
20 button = Button(size_hint=(None, None), text='plop', on_press=self.animate)
21 return button
22
23
24if __name__ == '__main__':
25 TestApp().run()
26
1import kivy
2kivy.require('1.0.6')
3
4from glob import glob
5from random import randint
6from os.path import join, dirname
7from kivy.app import App
8from kivy.logger import Logger
9from kivy.uix.scatter import Scatter
10from kivy.properties import StringProperty
11
12
13class Picture(Scatter):
14
15 source = StringProperty(None)
16
17
18class PicturesApp(App):
19
20 def build(self):
21
22 root = self.root
23 curdir = dirname(__file__)
24 for filename in glob(join(curdir, 'images', '*')):
25 try:
26 picture = Picture(source=filename, rotation=randint(-30, 30))
27 root.add_widget(picture)
28 except Exception as e:
29 Logger.exception('Pictures: Unable to load <%s>' % filename)
30
31 def on_pause(self):
32 return True
33
34
35if __name__ == '__main__':
36 PicturesApp().run()
37
Pygame
1import pygame
2import pygame.camera
3from pygame.locals import *
4
5
6class VideoCapturePlayer(object):
7
8 size = ( 640, 480 )
9 def __init__(self, **argd):
10 self.__dict__.update(**argd)
11 super(VideoCapturePlayer, self).__init__(**argd)
12
13 self.display = pygame.display.set_mode( self.size, 0 )
14 self.init_cams(0)
15
16 def init_cams(self, which_cam_idx):
17 self.clist = pygame.camera.list_cameras()
18 #print (self.clist)
19
20 if not self.clist:
21 raise ValueError("Sorry, no cameras detected.")
22
23 try:
24 cam_id = self.clist[which_cam_idx]
25 except IndexError:
26 cam_id = self.clist[0]
27
28 self.camera = pygame.camera.Camera(cam_id, self.size, "RGB")
29 self.camera.start()
30 self.clock = pygame.time.Clock()
31 self.snapshot = pygame.surface.Surface(self.size, 0, self.display)
32
33 def get_and_flip(self):
34 if 0 and self.camera.query_image():
35 self.snapshot = self.camera.get_image(self.snapshot)
36 if 0:
37 self.snapshot = self.camera.get_image(self.snapshot)
38 self.display.blit(self.snapshot, (0,0))
39 else:
40 self.snapshot = self.camera.get_image(self.display)
41
42 pygame.display.flip()
43
44 def main(self):
45 going = True
46 while going:
47 events = pygame.event.get()
48 for e in events:
49 if e.type == QUIT or (e.type == KEYDOWN and e.key == K_ESCAPE):
50 going = False
51 if e.type == KEYDOWN:
52 if e.key in range(K_0, K_0+10) :
53 self.init_cams(e.key - K_0)
54
55 self.get_and_flip()
56 self.clock.tick()
57 print (self.clock.get_fps())
58
59def main():
60 pygame.init()
61 pygame.camera.init()
62 VideoCapturePlayer().main()
63 pygame.quit()
64
65if __name__ == '__main__':
66 main()
67
1import random, os.path
2
3import pygame
4from pygame.locals import *
5
6class Player(pygame.sprite.Sprite):
7 speed = 10
8 bounce = 24
9 gun_offset = -11
10 images = []
11
12 def __init__(self):
13 pygame.sprite.Sprite.__init__(self, self.containers)
14 self.image = self.images[0]
15 self.rect = self.image.get_rect(midbottom=SCREENRECT.midbottom)
16 self.reloading = 0
17 self.origtop = self.rect.top
18 self.facing = -1
19
20 def move(self, direction):
21 if direction: self.facing = direction
22 self.rect.move_ip(direction*self.speed, 0)
23 self.rect = self.rect.clamp(SCREENRECT)
24 if direction < 0:
25 self.image = self.images[0]
26 elif direction > 0:
27 self.image = self.images[1]
28 self.rect.top = self.origtop - (self.rect.left//self.bounce%2)
29
30 def gunpos(self):
31 pos = self.facing*self.gun_offset + self.rect.centerx
32 return pos, self.rect.top
33
34
35class Alien(pygame.sprite.Sprite):
36 speed = 13
37 animcycle = 12
38 images = []
39 def __init__(self):
40 pygame.sprite.Sprite.__init__(self, self.containers)
41 self.image = self.images[0]
42 self.rect = self.image.get_rect()
43 self.facing = random.choice((-1,1)) * Alien.speed
44 self.frame = 0
45 if self.facing < 0:
46 self.rect.right = SCREENRECT.right
47
48 def update(self):
49 self.rect.move_ip(self.facing, 0)
50 if not SCREENRECT.contains(self.rect):
51 self.facing = -self.facing;
52 self.rect.top = self.rect.bottom + 1
53 self.rect = self.rect.clamp(SCREENRECT)
54 self.frame = self.frame + 1
55 self.image = self.images[self.frame//self.animcycle%3]
56
57
58class Explosion(pygame.sprite.Sprite):
59 defaultlife = 12
60 animcycle = 3
61 images = []
62 def __init__(self, actor):
63 pygame.sprite.Sprite.__init__(self, self.containers)
64 self.image = self.images[0]
65 self.rect = self.image.get_rect(center=actor.rect.center)
66 self.life = self.defaultlife
67
68 def update(self):
69 self.life = self.life - 1
70 self.image = self.images[self.life//self.animcycle%2]
71 if self.life <= 0: self.kill()
72
73
74class Shot(pygame.sprite.Sprite):
75 speed = -11
76 images = []
77 def __init__(self, pos):
78 pygame.sprite.Sprite.__init__(self, self.containers)
79 self.image = self.images[0]
80 self.rect = self.image.get_rect(midbottom=pos)
81
82 def update(self):
83 self.rect.move_ip(0, self.speed)
84 if self.rect.top <= 0:
85 self.kill()
86
87
88class Bomb(pygame.sprite.Sprite):
89 speed = 9
90 images = []
91 def __init__(self, alien):
92 pygame.sprite.Sprite.__init__(self, self.containers)
93 self.image = self.images[0]
94 self.rect = self.image.get_rect(midbottom=
95 alien.rect.move(0,5).midbottom)
96
97 def update(self):
98 self.rect.move_ip(0, self.speed)
99 if self.rect.bottom >= 470:
100 Explosion(self)
101 self.kill()
102
103
Mobile Applications
1import ast
2import os
3import sys
4
5from kivy.lang import Builder
6from kivy.factory import Factory
7
8from libs.baseclass.dialog_change_theme import KitchenSinkDialogChangeTheme
9from libs.baseclass.list_items import KitchenSinkOneLineLeftIconItem
10
11from kivymd.app import MDApp
12
13if getattr(sys, "frozen", False): # bundle mode with PyInstaller
14 os.environ["KITCHEN_SINK_ROOT"] = sys._MEIPASS
15else:
16 sys.path.append(os.path.abspath(__file__).split("demos")[0])
17 os.environ["KITCHEN_SINK_ROOT"] = os.path.dirname(os.path.abspath(__file__))
18os.environ["KITCHEN_SINK_ASSETS"] = os.path.join(
19 os.environ["KITCHEN_SINK_ROOT"], f"assets{os.sep}"
20)
21
22
23class KitchenSinkApp(MDApp):
24 def __init__(self, **kwargs):
25 super().__init__(**kwargs)
26 self.theme_cls.primary_palette = "Teal"
27 self.dialog_change_theme = None
28 self.toolbar = None
29 self.data_screens = {}
30
31 def build(self):
32 Builder.load_file(
33 f"{os.environ['KITCHEN_SINK_ROOT']}/libs/kv/list_items.kv"
34 )
35 Builder.load_file(
36 f"{os.environ['KITCHEN_SINK_ROOT']}/libs/kv/dialog_change_theme.kv"
37 )
38 return Builder.load_file(
39 f"{os.environ['KITCHEN_SINK_ROOT']}/libs/kv/start_screen.kv"
40 )
41
42 def show_dialog_change_theme(self):
43 if not self.dialog_change_theme:
44 self.dialog_change_theme = KitchenSinkDialogChangeTheme()
45 self.dialog_change_theme.set_list_colors_themes()
46 self.dialog_change_theme.open()
47
48 def on_start(self):
49 """Creates a list of items with examples on start screen."""
50
51 Builder.load_file(
52 f"{os.environ['KITCHEN_SINK_ROOT']}/libs/kv/base_content.kv"
53 )
54 Builder.load_file(
55 f"{os.environ['KITCHEN_SINK_ROOT']}/libs/kv/toolbar.kv"
56 )
57 with open(f"{os.getcwd()}/screens_data.json") as read_file:
58 self.data_screens = ast.literal_eval(read_file.read())
59
60 for name_item_example in self.data_screens.keys():
61 self.root.ids.backdrop_front_layer.data.append(
62 {
63 "viewclass": "KitchenSinkOneLineLeftIconItem",
64 "text": name_item_example,
65 "icon": self.data_screens[name_item_example]["icon"],
66 "on_release": lambda x=name_item_example: self.set_example_screen(
67 x
68 ),
69 }
70 )
71
72 def set_example_screen(self, name_screen):
73 manager = self.root.ids.screen_manager
74 if not manager.has_screen(
75 self.data_screens[name_screen]["name_screen"]
76 ):
77 name_kv_file = self.data_screens[name_screen]["kv_string"]
78 Builder.load_file(
79 f"{os.environ['KITCHEN_SINK_ROOT']}/libs/kv/{name_kv_file}.kv"
80 )
81 if "Import" in self.data_screens[name_screen]:
82 exec(self.data_screens[name_screen]["Import"])
83 screen_object = eval(self.data_screens[name_screen]["Factory"])
84 self.data_screens[name_screen]["object"] = screen_object
85 if "toolbar" in screen_object.ids:
86 screen_object.ids.toolbar.title = name_screen
87 manager.add_widget(screen_object)
88 manager.current = self.data_screens[name_screen]["name_screen"]
89
90 def back_to_home_screen(self):
91 self.root.ids.screen_manager.current = "home"
92
93 def callback_for_menu_items(self, *args):
94 from kivymd.toast import toast
95
96 toast(args[0])
97
98 def show_demo_shrine(self, instance):
99 """
100 :type instance <Screen name='shrine demo'> object
101
102 """
103
104 def add_screen_shrine(MDShrine):
105 def remove_box(*args):
106 instance.remove_widget(box)
107
108 from kivy.animation import Animation
109
110 md_shrine = MDShrine()
111 md_shrine.opacity = 0
112 instance.add_widget(md_shrine)
113
114 anim = Animation(opacity=0, d=0.5)
115 anim.bind(on_complete=remove_box)
116 anim.start(box)
117 Animation(opacity=2, d=0.5).start(md_shrine)
118 self.theme_cls.primary_palette = "Red"
119
120 def show_demo_shrine(interval):
121 from kivy.animation import Animation
122 from demos.kitchen_sink.studies.shrine.shrine import MDShrine
123
124 anim = Animation(
125 size_hint=(0.2, 0.2), pos_hint={"center_y": 0.7}, d=0.5
126 )
127 anim.bind(on_complete=lambda *x: add_screen_shrine(MDShrine))
128 anim.start(box)
129
130 from kivy.uix.boxlayout import BoxLayout
131 from kivy.metrics import dp
132 from kivy.uix.image import Image
133 from kivy.clock import Clock
134
135 box = BoxLayout(
136 orientation="vertical",
137 size_hint=(0.4, 0.6),
138 spacing=dp(10),
139 pos_hint={"center_x": 0.5, "center_y": 0.6},
140 )
141 path_to_logo = (
142 f"{os.environ['KITCHEN_SINK_ROOT']}/studies/shrine/data/images/shrine-white.png"
143 if self.theme_cls.theme_style == "Dark"
144 else f"{os.environ['KITCHEN_SINK_ROOT']}/studies/shrine/data/images/shrine-dark.png"
145 )
146 logo = Image(
147 source=path_to_logo, size_hint_x=0.8, pos_hint={"center_x": 0.5}
148 )
149 box.add_widget(logo)
150 box.add_widget(Factory.ShrinePresplashTile(text="SHRINE"))
151 instance.add_widget(box)
152 Clock.schedule_once(show_demo_shrine, 1)
153
154
155KitchenSinkApp().run()
156
Robot Applications
1# cozmosdk.anki.com/docs/getstarted.html
2
3import cozmo
4
5
6def cozmo_program(robot: cozmo.robot.Robot):
7 robot.say_text("Hello World").wait_for_completed()
8
9
10cozmo.run_program(cozmo_program)
1from naoqi import ALProxy
2tts = ALProxy("ALTextToSpeech", "<IP of your robot>", 9559)
3tts.say("Hello, world!")
4
5tts.setLanguage("Japanese")
6tts.say("こんにちは")v
Web Applications
ชุดคำสั่งสำหรับพัฒนาเว็บไซต์สำหรับภาษา Python ที่สำคัญมีดังนี้
Django
Laboratory
สร้างเว็บไซต์ส่วนตัวด้วย django บน https://pythonanywhere.com