def __init__(self, game, headless=True): if headless: logging.info("Running in headless mode") self.actions = [ self.build_ship, self.move_south, self.move_west, self.move_north, self.move_east, self.stay_still ] self.network = Network(headless, len(self.actions)) self.observer = Observer(game, headless) self.reward_map = { self.build_ship: [0, -10], self.move_south: [0, -10], self.move_west: [0, -10], self.move_north: [0, -10], self.move_east: [0, -10], self.stay_still: [1, -10] } self.network.draw() self.observer.new_observation() self.observer.draw(game) self.state = self.observer.show() self.command_queue = []
def __init__(self, inputComponents, velocityComponents): Observer.__init__(self) Publisher.__init__(self) self.inputComponents = inputComponents self.velocityComponents = velocityComponents self.inputMapper = InputMapper() self.fsm = FSM() FSMGraphFactory(self.fsm, GraphIDs.Moving)
def __init__(self): Observer.__init__(self) try: with open('matches.json', 'r') as infile: m = json.load(infile) self.matches = m except: # exception if file doesnt exist, we dont need to # create it now - matches dict is already created # and file will get created on first write pass
def __init__(self, subject, num_of_rows=20, num_of_cols=20, ratio=0.1): assert ratio >= 0 and ratio <= 1 assert num_of_rows >= 0 and num_of_cols >= 0 Observer.__init__(self, subject) Subject.__init__(self) self.num_of_rows = num_of_rows self.num_of_cols = num_of_cols self.round = 0 self.map = [[1 if random() < ratio else 0 \ for _ in range(num_of_cols)] for _ in range(num_of_rows)]
def addViewObservers(self): self.view.add_observer("on_open_click", Observer("open_observer"), self.open_file) self.view.add_observer("on_save_click", Observer("save_observer"), self.save_file) self.view.add_observer("on_tile_click", Observer("tile_observer"), self.on_tile_click) self.view.add_observer("on_resize", Observer("resize_observer"), self.on_resize) self.view.add_observer("on_listbox_selection", Observer("listbox_observer"), self.on_listbox_selection)
def __init__(self, root, parent, factory): #super(FileTable, self).__init__() Observer.__init__(self) Subject.__init__(self) self._root = root self._parent = parent self._factory = factory self._fileHash = dict() self._dirHash = dict() self._fileSelector = Selector(r"^\s*(\d+) (.*)$") self._dirSelector = Selector(r"^\s*(.*)/$")
def main(): """ Main function """ Observer.attach('add', Logger.log) Observer.attach('delete', Logger.log) Observer.attach('deleteInRange', Logger.log) Observer.attach('taskMethod', Logger.log) linked_list1 = Linked_list() linked_list2 = Linked_list() options = ('🌝 🌝 🌝 🌝 🌝 🌝 🌝 🌝\n' + '🌜 1 - first list 🌛\n' + '🌜 2 - second list 🌛\n' + '🌜 3 - list method 🌛\n' + '🌜 4 - print lists 🌛\n' + '🌜 5 - exit 🌛\n' + '🌝 🌝 🌝 🌝 🌝 🌝 🌝 🌝\n') while True: try: print(options) choice = v.intValidateInRange('Enter choice ', 1, 5) if choice == 1: linked_list1 = generateList(linked_list1, 'l1') elif choice == 2: linked_list2 = generateList(linked_list2, 'l2') elif choice == 3: linked_list1, linked_list2 = listMethod( linked_list1, linked_list2) elif choice == 4: print('list 1 - {}\nlist 2 - {}\n'.format( linked_list1, linked_list2)) elif choice == 5: break except Exception as e: print('Error ', '--' * 15, ' ', e)
def main(): options = '1 - Strategy 1\n2 - Strategy 2\n3 - generate data\n4 - remove at\n5 - remove in range\n6 - list method\n7 - print list\n8 - exit\n' linked_list = Linked_list() context = Context(StrategyIterator) Observer.attach('add', Logger.log) Observer.attach('delete', Logger.log) Observer.attach('deleteInRange', Logger.log) Observer.attach('taskMethod', Logger.log) while True: try: print(options) choice = v.intValidateInRange('Enter choice ', 1, 8) if choice == 1: context.strategy = StrategyIterator() elif choice == 2: context.strategy = StrategyReadFile() elif choice == 3: linked_list = generateMenu(linked_list, context) elif choice == 4: linked_list = deleteAtMenu(linked_list) elif choice == 5: linked_list = deleteInRangeMenu(linked_list) elif choice == 6: linked_list = listMethodMenu(linked_list) elif choice == 7: print(linked_list) elif choice == 8: break except Exception as e: print('Error ', '--' * 15, ' ', e)
def __init__(self, subject, timer): Observer.__init__(self, subject) self.tk = Tk() self.tk.geometry("400x440") self.timer = timer self.canvas = Canvas(self.tk, bg="white", width=360, height=360) self.canvas.place(x=20, y=20) self.round_label = Label(self.tk, text="round:0") self.round_label.place(x=20, y=396) self.start_button = Button(self.tk, text="start", width=8, command=self.start_button_onclick) self.start_button.place(x=316, y=396) self.tk.mainloop()
def __init__(self): super().__init__() self.image_paths = ImagePaths() self.window_setting_flag = QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint self.window_opacity = 1.0 # for slideshow self.is_active = False self.timer = QtCore.QTimer() self.timer.timeout.connect(self.update_image) self.update_interval = 2000 # ミリ秒 self.path_index = 0 # for status when dragging self.pressed_status = Pressed_status.NORMAL # for move action when dragging self.clicked_pos = QtCore.QPoint() self.size_when_clicked = QtCore.QSize() # for context menu self.menu = QtWidgets.QMenu() self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_context_menu) # for environmental_setting self.env_window = Environmental_setting() # for QSettings self.settings = QtCore.QSettings(QtCore.QSettings.IniFormat, QtCore.QSettings.UserScope, "Gampuku Viewer") self.settings.setIniCodec(QtCore.QTextCodec.codecForName("utf-8")) # for Obserber self.obserber = Observer() self.obserber.directory_changed.connect( self._directory_chage_occer_event) # それぞれの初期化 self.init_imageViewer() self.init_environmental_setting() self.init_shortcut()
def __init__(self, subject, timer): Observer.__init__(self, subject) self.tk = Tk() self.tk.geometry('400x440') self.timer = timer self.canvas = Canvas(self.tk, bg='white', width=360, height=360) self.canvas.place(x=20, y=20) self.round_label = Label(self.tk, text="round:0") self.round_label.place(x=20, y=396) self.start_button = Button(self.tk, text='start', width=8, command=self.start_button_onclick) self.start_button.place(x=316, y=396) self.tk.mainloop()
def main(): dt = datetime.now() print("Started at: %s" % dt) # Create Observer obs = Observer() obs.setupBleStack() # Matching address adr = 'DC:A6:32:63:50:9A' adr = None # Counter rx = 0 while (True): # Get received advertisements ad_structs, rssi, addr = obs.rxParse(match_addr=adr) # Check for address match and valid reception if rssi is not None and ad_structs is not None and addr is not None: # From our Pi only if includes: Name, TX Power name = next( (ad['data'] for ad in ad_structs if ad['type'] == 0x09), None) tx_power = next( (ad['data'] for ad in ad_structs if ad['type'] == 0x0A), None) # Detect parity bit if tx_power is not None: if tx_power[0] > 0x80: tx_power = tx_power[0] - 0x80 else: tx_power = tx_power[0] # Log if name is not None and tx_power is not None: print('%d %s "%s", TX: %ddBm, RSSI: %ddBm' % (rx, addr, name, tx_power, rssi)) else: print('%d %s, RSSI: %ddBm' % (rx, addr, rssi)) rx += 1
def menu(): c = Context() Observer.attach('add', FileLogger.logAdd) Observer.attach('remove', FileLogger.logRemove) Observer.attach('method', FileLogger.logMethodExecution) print('-' * 60) print('Welcome to pattern \'Strategy\' menu!') while True: print('-' * 60) print('Choose one of the following options:\n', '1 - Choose \'Read From File\' strategy\n', '2 - Choose \'Generate using Iterator\' strategy\n', '3 - Generate list\n', '4 - Delete element by index\n', '5 - Delete element using slice\n', '6 - Reverse alternations\n', '7 - Print the list\n', '8 - Exit menu') menuChoise = input() try: if (menuChoise == '1'): c.setStrategy(ReadFileStrategy()) print('Strategy set to \'' + c.strategy() + '\'!') elif (menuChoise == '2'): c.setStrategy(IteratorStrategy()) print('Strategy set to \'' + c.strategy() + '\'!') elif (menuChoise == '3'): generateMenu(c) elif (menuChoise == '4'): deleteMenu(c) elif (menuChoise == '5'): sliceMenu(c) elif (menuChoise == '6'): methodMenu(c) elif (menuChoise == '7'): print(c.lst()) elif (menuChoise == '8'): break else: print('-' * 60 + '\n', 'Bad value') except (AttributeError, ValueError, IndexError, FileNotFoundError) as err: print(str(err))
def menu(): c1 = Context() c2 = Context() # Observer.attach('add', FileLogger.logAdd) # Observer.attach('remove', FileLogger.logRemove) # Observer.attach('method', FileLogger.logMethodExecution) Observer.attach('add', FileLogger.log) Observer.attach('remove', FileLogger.log) Observer.attach('method', FileLogger.log) print('-'*60) print('Welcome to pattern \'Strategy\' menu!') print('First fill two lists with both strategies:') while True: try: print('-'*60) generateWithReadFile(c1) print('-'*60) generateWithIterator(c2) break except (AttributeError, ValueError, IndexError, FileNotFoundError) as err: print(str(err)) while True: print('-'*60) print('Choose one of the following options:\n', '1 - Delete element by index\n', '2 - Delete element using slice\n', '3 - Reverse alternations\n', '4 - Print the list\n', '5 - Exit menu') menuChoise = input() try: if (menuChoise == '1'): deleteMenu(c1, c2) elif (menuChoise == '2'): sliceMenu(c1, c2) elif (menuChoise == '3'): methodMenu(c1, c2) elif (menuChoise == '4'): printMenu(c1, c2) elif (menuChoise == '5'): break else: print('-' * 60+'\n', 'Bad value') except (AttributeError, ValueError, IndexError, FileNotFoundError) as err: print(str(err))
def main(f): dt = datetime.now() print("Started at: %s" % dt) # Create Observer obs = Observer() obs.setupBleStack() # Define mission dist = 5 numt = 20 # Matching address adr = 'B8:27:EB:67:72:BF' # Must use state machine due to blocking socket state = 'wait' df = datetime.now() rxn = 0 while True: # Get data ads, rssi, addr = obs.rxParse(match_addr=adr) if state == 'wait': rxn = 0 # Wait for input dist = input("Enter distance in METRES (float): ") print("Capturing %d packets at %.2f metres, please wait..." % (numt, dist)) f.write("%.2f," % (dist)) df = datetime.now() + timedelta(seconds=3) # Next state state = 'clear' elif state == 'clear': if datetime.now() < df: state = 'clear' else: state = 'capture' elif state == 'capture': if rssi is not None: name = next((ad['data'] for ad in ads if ad['type'] == 0x09), None) txp = next((ad['data'] for ad in ads if ad['type'] == 0x0A), None) if txp is not None: if txp[0] > 0x80: txp = txp[0] - 0x80 else: txp = txp[0] print('%d %s "%s" %ddBm %ddBm' % (rxn, addr, name, txp, rssi)) f.write("%.0f" % (rssi)) rxn += 1 if rxn < numt: f.write(",") # Next state if rxn > numt - 1: state = 'post-capture' else: state = 'capture' elif state == 'post-capture': f.write("\n") print("Distance done") state = 'wait' # Measurement complete f.close() print("Measurement complete: %s" % datetime.now())
from MyMusic import MyMusic from Observer import Observer o = Observer() o.observe()
d_stats = dict() d_stats['config'] = config d_stats['neighbours_ids'] = dict() d_stats['neighbours_lastmsg_time'] = dict() d_stats['t_init'] = int(time.strftime("%s")) d_stats['server_id'] = 1 d_stats['membership'] = dict() d_stats['l_threads'] = list() d_stats['count_rcv_msg'] = 0 d_stats['conns'] = 0 # Launching server if config['Server']['SocketType'] == 'udp': server = SocketServer.UDPServer((config['Server']['ListeningToAddress'], int(config['Server']['ListeningToPort'])), MyUDPHandler) elif config['Server']['SocketType'] == 'tcp': server = TCPServer(config['Server']['ListeningToAddress'], int(config['Server']['ListeningToPort']), max_threads = 16, stats=d_stats, config = config, queue=None, whoami='server') else: logging.critical("Error: SocketType is neither udp or tcp.") exit(1) # Launching Observer obs = Observer(server, d_stats) # Now listen to petitions server.serve_forever()
def setUp(self): self.listen = Listener(FTPFactory().GetFTP(), '/') self.observer = Observer() self.listen.Attach(self.observer)
def __init__(self): Observer.__init__(self) self.panels = [] self.BindEvt(LogicEvt.UIDraw, self.OnDraw)
def __init__(self, ui, mh): Observer.__init__(self) self.ui = ui self.mh = mh
def test_subscribe_to_racer(self): racer = Racer('Craig', 'Tingey', 123) observer = Observer('Agro') observer.subscribe(racer) self.assertTrue(observer.subscribedtolist[0] == racer)
print('8.Enter e to exit menu') def print_dict(g_dict): print('First list:', g_dict['1']) print('Second list:', g_dict['2']) strategy = 0 first_list = LinkedList() second_list = LinkedList() list_dict = {'1': first_list, '2': second_list} context = Context() first_strategy = FirstStrategy() second_strategy = SecondStrategy() Observer.attach('add', Logger.changing_list_print) Observer.attach('delete', Logger.changing_list_print) Observer.attach('main_func', Logger.main_list_method_print) while True: menu() user_choice = input() if user_choice == 'e': break elif user_choice == 'i': context.set_strategy(first_strategy) print('Strategy 1 chosen') elif user_choice == 'f':
class ImageViewer(QtWidgets.QGraphicsView): def __init__(self): super().__init__() self.image_paths = ImagePaths() self.window_setting_flag = QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint self.window_opacity = 1.0 # for slideshow self.is_active = False self.timer = QtCore.QTimer() self.timer.timeout.connect(self.update_image) self.update_interval = 2000 # ミリ秒 self.path_index = 0 # for status when dragging self.pressed_status = Pressed_status.NORMAL # for move action when dragging self.clicked_pos = QtCore.QPoint() self.size_when_clicked = QtCore.QSize() # for context menu self.menu = QtWidgets.QMenu() self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_context_menu) # for environmental_setting self.env_window = Environmental_setting() # for QSettings self.settings = QtCore.QSettings(QtCore.QSettings.IniFormat, QtCore.QSettings.UserScope, "Gampuku Viewer") self.settings.setIniCodec(QtCore.QTextCodec.codecForName("utf-8")) # for Obserber self.obserber = Observer() self.obserber.directory_changed.connect( self._directory_chage_occer_event) # それぞれの初期化 self.init_imageViewer() self.init_environmental_setting() self.init_shortcut() def init_imageViewer(self): initial_size = QtCore.QSize(480.0, 270.0) # px self.resize(initial_size) # 初期ウィンドウサイズを指定 initial_pos = self._get_initial_pos_hint() self.move(initial_pos) # ウィンドの場所を移動 self.setWindowFlags(self.window_setting_flag) self.setMinimumSize(160, 90) self.setBackgroundBrush(QtGui.QColor("#181A1B")) self.setWindowOpacity(self.window_opacity) # QGraphicsViewの設定 self.setCacheMode(QtWidgets.QGraphicsView.CacheBackground) self.setRenderHints(QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform | QtGui.QPainter.TextAntialiasing) # QGraphicsSceneの作成・および設定. scene = ImageViewScene(self.width(), self.height()) scene.setSceneRect(QtCore.QRectF(self.rect())) self.setScene(scene) def show_context_menu(self): # アクションの設定 open_folder = QtWidgets.QAction("フォルダーを開く") open_folder.triggered.connect(self._select_folder_event) open_environmental_setting = QtWidgets.QAction("環境設定を開く") open_environmental_setting.triggered.connect( self.show_environmental_setting) exit_action = QtWidgets.QAction("終了") exit_action.triggered.connect(self.close) # メニューを構築 self.menu.addAction(open_folder) self.menu.addAction(open_environmental_setting) self.menu.addSection("") self.menu.addAction(exit_action) # メニューを表示 self.menu.exec_(QtGui.QCursor.pos()) # マウスの座標を引数に渡す def init_environmental_setting(self): # env_windowからでるsignalを接続 self.env_window.update_interval_changed.connect( self.set_update_interval) self.env_window.opacity_changed.connect(self.set_opacity) self.env_window.window_on_top_state_changed.connect( self.set_window_setting_flag) # iniファイルから情報を読み込む loaded_update_interval = int( self.settings.value("update_interval", 2000)) loaded_opacity = float(self.settings.value("opacity", 1.0)) loaded_is_on_top = int( self.settings.value( "is_on_top", QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint)) # 環境設定の情報を渡す self.env_window.set_update_interval(loaded_update_interval) self.env_window.set_opacity(loaded_opacity) self.env_window.set_is_on_top(loaded_is_on_top) def show_environmental_setting(self): # 環境設定ウィンドウを表示 self.env_window.show() self.env_window.raise_() # ディスプレイの中央の座標を求める screen_size = QtWidgets.qApp.desktop().size() central_pos = QtCore.QPoint( screen_size.width() // 2 - self.env_window.size().width(), screen_size.height() // 2 - self.env_window.size().height()) # 中央の移動 self.env_window.move(central_pos) def _get_initial_pos_hint(self) -> QtCore.QPoint: """ 必ずウィンドウのサイズの初期化を行ってからこの関数を呼び出してください """ # ディスプレイのタスクバーなどを除いたサイズを所得 d_width = QtWidgets.qApp.desktop().availableGeometry().width() d_height = QtWidgets.qApp.desktop().availableGeometry().height() margin = 30 # px return QtCore.QPoint(d_width - self.width() - margin, d_height - self.height() - margin) def init_shortcut(self): # フォルダを選択 open_folder_event = QtWidgets.QShortcut(QtGui.QKeySequence('Ctrl+O'), self) open_folder_event.activated.connect(self._select_folder_event) # 環境設定 show_env_window_event = QtWidgets.QShortcut( QtGui.QKeySequence('Ctrl+,'), self) show_env_window_event.activated.connect( self.show_environmental_setting) # 終了 close_event = QtWidgets.QShortcut(QtGui.QKeySequence('Ctrl+W'), self) close_event.activated.connect(self.close) def set_update_interval(self, sec: int) -> None: # 秒をミリ秒に直す m_sec = sec * 1000 self.update_interval = m_sec if self.is_active: self.timer.start(self.update_interval) def set_opacity(self, reversed_opacity: int) -> None: # 入力では1-opacityの形で与えられる # 透明度を小数に直し,opacityを元の形に戻す self.window_opacity = 1.0 - float(reversed_opacity) / 100 if self.window_opacity < 0.10: # ウィンドウが不本意に非アクティブになるバグを回避するため self.window_opacity = 0.10 # ウィンドウの透明度を変更 self.setWindowOpacity(self.window_opacity) # フラグを更新するとウィンドウが消えるので再描画 self.show() def set_window_setting_flag(self, state: int) -> None: if state == QtCore.Qt.Unchecked: self.window_setting_flag = QtCore.Qt.FramelessWindowHint elif state == QtCore.Qt.Checked: self.window_setting_flag = QtCore.Qt.FramelessWindowHint | QtCore.Qt.WindowStaysOnTopHint # フラグを更新 self.setWindowFlags(self.window_setting_flag) # フラグを更新するとウィンドウが消えるので再描画 self.show() def show_set_Dialog(self) -> bool: # iniファイルから前回選択したディレクトリパスを取り出す loaded_dir_path = self.settings.value("selected_dir_path", os.path.expanduser('~')) # ファイルダイアログを表示 selected_dir_path = QtWidgets.QFileDialog.getExistingDirectory( self, 'Select Folder', loaded_dir_path) # フォルダーが選択されなかったら終了しFalseを返す if selected_dir_path == '': return False # 画像パスのリストを生成 self.image_paths.make_list(selected_dir_path) # 選択したディレクトリパスをiniファイルに保存 self.settings.setValue("selected_dir_path", selected_dir_path) # フォルダーが選択されたらTrueを返す return True def start_slideshow(self): if not self.image_paths: return # 初期化 self.path_index = 0 # 画像更新をする関数を呼び出すタイマーをスタートする self.timer.start(self.update_interval) # 最初に表示する画像をセットする self.update_image() # 更新間隔を変更時に使用するフラグを立てる self.is_active = True # ディレクトリを監視するクラスをスタートする self.obserber.set__target_path(self.image_paths.get_dir_path()) self.obserber.start() def restart_slideshow(self): if not self.image_paths: return # 画像更新をする関数を呼び出すタイマーをスタートする self.timer.start(self.update_interval) # 更新間隔を変更時に使用するフラグを立てる self.is_active = True # ディレクトリを監視するクラスをスタートする self.obserber.set__target_path(self.image_paths.get_dir_path()) self.obserber.start() def stop_slideshow(self): # 画像更新をする関数を呼び出すタイマーをストップする self.timer.stop() self.is_active = False def update_image(self): # インデックスが最後まで到達したら最初に戻す if self.path_index == len(self.image_paths): self.path_index = 0 try: # 画像をセットする self.scene().set_file(self.image_paths[self.path_index]) except ZeroDivisionError: # アクセス権限がない画像などboundingRectが所得できないため # 0除算が起こるため、その時は無視するようにする self.path_index += 1 self.update_image() return # インデックスを更新 self.path_index += 1 def _select_folder_event(self): # フォルダーを選択する時の動作をまとめたメソッド self.stop_slideshow() is_selected = self.show_set_Dialog() # フォルダーの選択をキャンセルしたらそのまま再生 if is_selected: self.start_slideshow() else: self.restart_slideshow() def _directory_chage_occer_event(self): # 選択してたディレクトリに新しい画像が入ったり消 # えたりした時に呼ばれるメソッド self.stop_slideshow() # image_pathsを作り直す self.image_paths.make_list(self.image_paths.get_dir_path()) self.start_slideshow() def resizeEvent(self, event): super().resizeEvent(event) # ビューをリサイズ時にシーンの矩形を更新する self.scene().setSceneRect(QtCore.QRectF(self.rect())) # sceneにわたしている情報を更新 self.scene().set_secene_size(self.width(), self.height()) # 画像をscheneのサイズに合うようにリサイズする self.scene().fit_image() ''' mouseEventの関数群で,四隅のドラッグでリサイズを,それ以外の場所でのドラッグで 移動を実装している それぞれ別の関数に分けたほうがいい気がするが,ライブラリが用意したイベントハンドラ の関係で分けれていない ''' def mousePressEvent(self, event): self.clicked_pos = event.pos() # ウィンドの左上を(0,0)にした相対位置 self.size_when_clicked = self.size() grip_range = 10 # px if event.button() == QtCore.Qt.LeftButton: if (self.clicked_pos.x() < grip_range and self.clicked_pos.y() < grip_range): # ウィンドウの左上を掴んだ時 self.pressed_status = Pressed_status.RESIZEABLE_UPPER_LEFT elif (abs(self.clicked_pos.x() - self.width()) < grip_range and self.clicked_pos.y() < grip_range): # ウィンドウの右上を掴んだ時 self.pressed_status = Pressed_status.RESIZEABLE_UPPER_RIGHT elif (abs(self.clicked_pos.x() - self.width()) < grip_range and abs(self.clicked_pos.y() - self.height()) < grip_range): # ウィンドウの右下を掴んだ時 self.pressed_status = Pressed_status.RESIZEABLE_UNDER_RIGHT elif (self.clicked_pos.x() < grip_range and abs(self.clicked_pos.y() - self.height()) < grip_range): # ウィンドウの左下を掴んだ時 self.pressed_status = Pressed_status.RESIZEABLE_UNDER_LEFT else: # それ以外の場所を掴んだ時 self.pressed_status = Pressed_status.DRAGGABLE self.setCursor(QtCore.Qt.ClosedHandCursor) # カーソルを掴む手の絵に変更 def mouseMoveEvent(self, event): if event.button() == QtCore.Qt.LeftButton: if self.pressed_status == Pressed_status.RESIZEABLE_UPPER_LEFT: # マウスの移動距離を求める delta_pos = event.pos() - self.clicked_pos delta_x = self.width() - delta_pos.x() delta_y = self.height() - delta_pos.y() # サイズを更新 self.resize(delta_x, delta_y) # 位置の更新 self.move(self.pos().x() + delta_pos.x(), self.pos().y() + delta_pos.y()) elif self.pressed_status == Pressed_status.RESIZEABLE_UPPER_RIGHT: # マウスの移動距離を求める delta_pos = event.pos() - self.clicked_pos delta_x = self.size_when_clicked.width() + delta_pos.x() delta_y = self.height() - delta_pos.y() # サイズを更新 self.resize(delta_x, delta_y) # 位置の更新 self.move(self.pos().x(), self.pos().y() + delta_pos.y()) elif self.pressed_status == Pressed_status.RESIZEABLE_UNDER_RIGHT: # マウスの移動距離を求める delta_pos = event.pos() - self.clicked_pos delta_x = self.size_when_clicked.width() + delta_pos.x() delta_y = self.size_when_clicked.height() + delta_pos.y() # サイズを更新 self.resize(delta_x, delta_y) elif self.pressed_status == Pressed_status.RESIZEABLE_UNDER_LEFT: # マウスの移動距離を求める delta_pos = event.pos() - self.clicked_pos delta_x = self.width() - delta_pos.x() delta_y = self.size_when_clicked.height() + delta_pos.y() # サイズを更新 self.resize(delta_x, delta_y) # 位置の更新 self.move(self.pos().x() + delta_pos.x(), self.pos().y()) elif self.pressed_status == Pressed_status.DRAGGABLE: # マウスの移動距離を求める delta_pos = event.pos() - self.clicked_pos # 現在位置を更新 self.move(self.pos() + delta_pos) def mouseReleaseEvent(self, event): self.pressed_status = Pressed_status.NORMAL self.unsetCursor() # カーソルを元に戻す def closeEvent(self, event): # 環境設定で設定したことをiniファイルの保存 self.settings.setValue("update_interval", int(self.update_interval)) self.settings.setValue("opacity", float(self.window_opacity)) self.settings.setValue("is_on_top", int(self.window_setting_flag)) # iniファイルに書き出す self.settings.sync() # 環境設定が開いている場合、閉じる self.env_window.close()
def test_unsubscribe_to_racer(self): racer = Racer('Craig', 'Tingey', 123) observer = Observer('Agro') observer.subscribe(racer) observer.unsubscribe(racer) self.assertTrue(len(observer.subscribedtolist) == 0)