Можете ли вы изменить размер окна overflowdirect в tkinter без мерцания при одновременной настройке положения и ширины?Python

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Можете ли вы изменить размер окна overflowdirect в tkinter без мерцания при одновременной настройке положения и ширины?

Сообщение Гость »


У меня есть окно overridredirect, размер которого мне нужно изменить при перетаскивании мышью.

Пример работает, но когда я перетаскиваю любое из: sw, w, nw, n и ne обрабатывает это, вызывая мерцание (наиболее заметное при быстром перетаскивании). Вероятно, это связано с одновременной корректировкой положения и размера.

Я попробовал update_idletasks посмотреть, сгладит ли это переход, но не помогло.

импортировать tkinter как tk класс Box(tk.Tk): защита __init__(сам): супер().__init__() self.drag_point_x = Нет self.drag_point_y = Нет self.drag_margin = 15 собственная ширина = 400 self.height = 200 self.x = 300 self.y = 300 self.geometry(f"{self.width}x{self.height}+{self.x}+{self.y}") self.overrideredirect(1) self.bind("", self.on_dragged) self.bind("", self.on_click) self.bind("", self.on_motion) Защиту on_dragged (я, событие): mouse_x = self.winfo_pointerx() mouse_y = self.winfo_pointery() delta_width = self.x - mouse_x delta_height = self.y - mouse_y если self.drag_point == 'e': self.width = mouse_x - self.x elif self.drag_point == 'se': self.width = mouse_x - self.x self.height = mouse_y - self.y elif self.drag_point == 's': self.height = mouse_y - self.y elif self.drag_point == 'sw': self.height = mouse_y - self.y self.width += delta_width self.x = mouse_x elif self.drag_point == 'w': self.width += delta_width self.x = mouse_x elif self.drag_point == 'nw': self.width += delta_width self.height += delta_height self.x = mouse_x self.y = mouse_y elif self.drag_point == 'n': self.height += delta_height self.y = mouse_y elif self.drag_point == 'ne': self.width = mouse_x - self.x self.height += delta_height self.y = mouse_y self.geometry(f"{self.width}x{self.height}+{self.x}+{self.y}") def on_click(сам, событие): self.drag_point_x = event.x self.drag_point_y = event.y Защиту on_motion (я, событие): если event.x < self.drag_margin: если event.y < self.drag_margin: self.config(cursor="size_nw_se") self.drag_point = "nw" elif event.y > self.height - self.drag_margin: self.config(cursor="size_ne_sw") self.drag_point = "sw" еще: self.config(cursor="size_we") self.drag_point = "w" elif event.x > self.width - self.drag_margin: если event.y < self.drag_margin: self.config(cursor="size_ne_sw") self.drag_point = "не" elif event.y > self.height - self.drag_margin: self.config(cursor="size_nw_se") self.drag_point = "се" еще: self.config(cursor="size_we") self.drag_point = "е" elif event.y < self.drag_margin: self.config(cursor="size_ns") self.drag_point = "n" elif event.y > self.height - self.drag_margin: self.config(cursor="size_ns") self.drag_point = "s" еще: self.config(курсор="") self.drag_point = Нет если __name__ == "__main__": коробка = Коробка() коробка.mainloop() ОБНОВЛЕНИЕ:

Вот код, основанный на решении OneMadGypsy, который добавляет поддержку нескольких мониторов:
импортировать tkinter как tk из PIL импортировать ImageGrab из screeninfo импортировать get_monitors класс Overlay(tk.Toplevel): def __init__(сам, монитор, наложения): tk.Toplevel.__init__(self) self.b_x = 0 self.b_y = 0 self.e_x = 0 self.e_y = 0 self.drag = Ложь self.overlays = наложения self.monitor = монитор self.configure(курсор='крест') self.attributes('-альфа', 0.3) self.attributes('-topmost', True) self.overrideredirect(Истина) self.geometry(f"{self.monitor.width}x{self.monitor.height}+{self.monitor.x}+{self.monitor.y}") self.canvas = tk.Canvas(self, bg='темно-серый') self.canvas.pack(fill='both',expand=True) self.canvas.bind('', self.on_drag) self.canvas.bind('', self.on_press) self.canvas.bind('', self.on_release) прямая = дикт( контур = '# 0052d6', fill='белый', теги = 'snip_rect', ширина=2, ) self.canvas.create_rectangle(0, 0, 0, 0, **rect) Защиту on_press (я, событие): self.b_x = event.x self.b_y = event.y Защиту on_drag (я, событие): self.drag = Истина self.e_x = event.x self.e_y = event.y self.canvas.coords('snip_rect', self.b_x, self.b_y, self.e_x, self.e_y) Защиту on_release (я, событие): само.уничтожить() для окна в self.overlays: если окно: окно.уничтожить() self.overlays.clear() если не self.drag: возвращаться скорректированный_b_x = self.b_x + self.monitor.x скорректированный_b_y = self.b_y + self.monitor.y скорректированный_e_x = self.e_x + self.monitor.x скорректированный_e_y = self.e_y + self.monitor.y изображение = ImageGrab.grab(bbox=(min(adjusted_b_x, скорректированный_e_x), мин(скорректированный_b_y, скорректированный_e_y), Макс (скорректированный_b_x, скорректированный_e_x), max(adjusted_b_y, скорректированный_e_y)), all_screens=True) изображение.шоу() класс Сниппер: защита __init__(сам): self.image = Нет self.overlays = [] Защитный фрагмент (сам): мониторы = get_monitors() для монитора в мониторах: наложение = Наложение (монитор, self.overlays) self.overlays.append(оверлей) если __name__ == '__main__': класс приложения(tk.Tk): def __init__(self, **kwargs): tk.Tk.__init__(self, **kwargs) self.image = Нет self.windows = [] self.snipper = Снайпер() tk.Button(self, text='snip', width=50, команда=self.snipper.snip).pack() приложение = Приложение() приложение.mainloop()
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»