Можете ли вы изменить размер окна overflowdirect в tkinter без мерцания при одновременной настройке положения и ширины? ⇐ Python
Можете ли вы изменить размер окна overflowdirect в tkinter без мерцания при одновременной настройке положения и ширины?
У меня есть окно overflowdirect, размер которого нужно изменить при перетаскивании мышью.
Пример рабочий, но когда я перетаскиваю края/углы sw, w, nw, n и ne, возникает мерцание (наиболее заметное при быстром перетаскивании), скорее всего из-за того, что в этом случае я регулирую ширину/углы. высота и положение одновременно.
Я попробовал обновить Idle_tasks, чтобы посмотреть, сгладит ли это переход, но это не помогло.
импортировать 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()
У меня есть окно overflowdirect, размер которого нужно изменить при перетаскивании мышью.
Пример рабочий, но когда я перетаскиваю края/углы sw, w, nw, n и ne, возникает мерцание (наиболее заметное при быстром перетаскивании), скорее всего из-за того, что в этом случае я регулирую ширину/углы. высота и положение одновременно.
Я попробовал обновить Idle_tasks, чтобы посмотреть, сгладит ли это переход, но это не помогло.
импортировать 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()
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение