Задача: нарисовать окно с меню, по нажатию клавиши переходить в полноэкранный режим и обратно. Для полноэкранного режима надо эту строку меню удалять.
Результат:
- python 3.5 на windows 10 - всё работает как и должно.
- python 3.4 на fedora 23 - меню удаляется, но сверху остаётся полоса в 2 пикселя шириной. Теперь вопрос: это баг или её можно убрать?
Код:
import tkinter class main(): fullscreen_flag = False def __init__(self): self.root = tkinter.Tk() self.create_menu() self.canvas = tkinter.Canvas(width = 400, height = 300, bg = "black", bd = 0, highlightthickness = 0) self.canvas.pack() self.root.bind("<Return>", self.fullscreen) self.root.mainloop() def create_menu(self): if self.fullscreen_flag: self.menubar.delete(1) else: self.menubar = tkinter.Menu(self.root) filemenu = tkinter.Menu(self.menubar, tearoff = 0) filemenu.add_command(label = "Open") filemenu.add_command(label = "Save") filemenu.add_separator() filemenu.add_command(label = "Exit") self.menubar.add_cascade(label = "File", menu = filemenu, hidemargin = 0) self.root.config(menu = self.menubar) def fullscreen(self, *opt): if self.fullscreen_flag: self.root.attributes("-fullscreen", 0) self.fullscreen_flag = False self.canvas.config(width = 400, height = 300) else: self.root.attributes("-fullscreen", 1) self.fullscreen_flag = True self.canvas.config(width = self.root.winfo_screenwidth(), height = self.root.winfo_screenheight()) self.canvas.update() self.create_menu() if __name__ == '__main__': main()
Вот скрин если: Tk - меню вообще не создано, Tk#2 - меню создано и удалено.
Вопрос №2
Ну пока на этот вопрос никто не ответил, зададим ещё один:
Имеется программа с canvas`ом на весь экран, размер его зависит от размера окна. Всё работает хорошо, но получается так, что с изменением размера не удаляются объекты, то есть (если смотреть в диспетчере задач) постепенно увеличивается оперативная память, используемая приложением. Если же полностью удалять canvas (вторая функция), то всё чистится как надо; но при этом будет очень долгая прорисовка, да и вообще эта функция больше напоминает костыль. Поведение одинаковое, что на windows, что на fedora.
Как всё ж правильно удалять объекты с холста?
Вот код:
import tkinter class main(): rootgeometry = [0, 0] radius = 25 def __init__(self): self.root = tkinter.Tk() self.canvas = tkinter.Canvas(width = 400, height = 300, bg = "black", bd = 0, highlightthickness = 0) self.canvas.pack() self.root.bind("<Configure>", self.resize) self.root.mainloop() def resize(self, event): if self.rootgeometry != [event.width, event.height]: self.rootgeometry = [event.width, event.height] self.canvasdel() self.canvas.config(width = event.width, height = event.height) cen = [event.width / 2, event.height / 2] obj = self.canvas.create_oval(cen[0] - self.radius, cen[1] - self.radius, cen[0] + self.radius, cen[1] + self.radius, fill = "white", width = 0, tag = "circle") self.canvas.tag_bind(obj, "<ButtonPress-1>", lambda event: print("hop")) for index in range(1, self.radius // 2): radiustemp = self.radius - index * 2 self.canvas.create_oval(cen[0] - radiustemp, cen[1] - radiustemp, cen[0] + radiustemp, cen[1] + radiustemp, fill = ["red", "yellow"][index % 2], width = 0, tag = "circle", state = "disabled") def canvasdel(self): self.canvas.tag_unbind("circle", "<ButtonPress-1>") self.canvas.delete("all") def canvasdel2(self): self.canvas.destroy() self.canvas = tkinter.Canvas(width = 400, height = 300, bg = "black", bd = 0, highlightthickness = 0) self.canvas.pack() if __name__ == '__main__': main()