Пример #1
0
    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 = []
Пример #2
0
    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)
Пример #3
0
 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
Пример #4
0
    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)]
Пример #5
0
 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)
Пример #6
0
    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*(.*)/$")
Пример #7
0
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)
Пример #8
0
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)
Пример #9
0
    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()
Пример #10
0
    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()
Пример #11
0
    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()
Пример #12
0
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
Пример #13
0
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))
Пример #14
0
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))
Пример #15
0
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())
Пример #16
0
from MyMusic import MyMusic
from Observer import Observer

o = Observer()
o.observe()
Пример #17
0
	
	
	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()

Пример #18
0
    def setUp(self):
        self.listen = Listener(FTPFactory().GetFTP(), '/')
        self.observer = Observer()

        self.listen.Attach(self.observer)
Пример #19
0
 def __init__(self):
     Observer.__init__(self)
     self.panels = []
     self.BindEvt(LogicEvt.UIDraw, self.OnDraw)
Пример #20
0
 def __init__(self, ui, mh):
     Observer.__init__(self)
     self.ui = ui
     self.mh = mh
Пример #21
0
 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':
Пример #23
0
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()
Пример #24
0
 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)