Форум сайта python.su
Здравствуйте. Решил тут вспомнить питон и наткнулся на такую вещь:
Задача: нарисовать окно с меню, по нажатию клавиши переходить в полноэкранный режим и обратно. Для полноэкранного режима надо эту строку меню удалять.
Результат:
- 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()
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()
Отредактировано Paranoia_Agent (Окт. 27, 2016 01:24:12)
Офлайн
Подниму тему, так как дописал второй вопрос.
P.S. Надо было, наверное, новую тему создать, что-то я ступил…
Офлайн
Насчет 1 вопроса Вам вряд-ли кто-то поможет.
2 вопрос. Вы уверены, что для удаления нужно передавать аргумент “all” и он правильно выполняется?
Офлайн
Вы уверены, что для удаления нужно передавать аргумент “all” и он правильно выполняется?
Ну с экрана все элементы удаляются (по крайней мере их не видно).
Если написать:
self.canvas.delete("circle")
Отредактировано Paranoia_Agent (Окт. 27, 2016 18:00:59)
Офлайн
С канвасом не работал. Попробуйте удалять объекты по id или тегу.
Офлайн
self.canvas.delete("circle")
Офлайн
Paranoia_Agent по пункту 1 - зависит от ОС, оконного менеджера и т.д.
попробуйте запустить в чистых иксах из консоли
startx python myfile.py
Онлайн
4kpt_IVПроверил, по id тоже не полностью удаляется.
С канвасом не работал. Попробуйте удалять объекты по id или тегу.
vic57Я не очень силён в линуксе. От user`a пишет нет прав, от рута пишет, что не знает команды python3:
Paranoia_Agent по пункту 1 - зависит от ОС, оконного менеджера и т.д. попробуйте запустить в чистых иксах из консоли
[root@localhost Документы]# startx python3 Test3.pyw
xauth: file /root/.serverauth.2559 does not exist
X.Org X Server 1.18.3
Release Date: 2016-04-04
X Protocol Version 11, Revision 0
Build Operating System: 4.4.9-300.fc23.x86_64
Current Operating System: Linux localhost.localdomain 4.5.7-202.fc23.x86_64 #1 SMP Tue Jun 28 18:22:51 UTC 2016 x86_64
Kernel command line: BOOT_IMAGE=/vmlinuz-4.5.7-202.fc23.x86_64 root=/dev/mapper/fedora-root00 ro rd.lvm.lv=fedora/root00 rd.lvm.lv=fedora/swap rhgb quiet LANG=ru_RU.UTF-8
Build Date: 30 June 2016 11:04:38PM
Build ID: xorg-x11-server 1.18.3-3.fc23
Current version of pixman: 0.34.0
Before reporting problems, check http://wiki.x.org
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.2.log", Time: Sun Oct 30 04:12:09 2016
(==) Using config directory: "/etc/X11/xorg.conf.d"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
xterm: Explicit shell already was /usr/bin/xterm
xterm: bad command line option "python3"
usage: xterm [-/+132] [-C] [-Sccn] [-T string] [-/+ah] [-/+ai] [-/+aw]
[-b number] [-/+bc] [-bcf milliseconds] [-bcn milliseconds] [-bd color]
[-/+bdc] [-bg color] [-bw number] [-/+cb] [-cc classrange] [-/+cjk_width]
[-class string] [-/+cm] [-/+cn] [-cr color] [-/+cu] [-/+dc]
[-display displayname] [-e command args ...] [-fa pattern] [-fb fontname]
[-/+fbb] [-/+fbx] [-fd pattern] [-fg color] [-fi fontname] [-fn fontname]
[-fs size] [-/+fullscreen] [-fw fontname] [-fwb fontname] [-fx fontname]
[%geom] [#geom] [-geometry geom] [-help] [-/+hm] [-/+hold] [-iconic]
[-/+ie] [-/+im] [-into windowId] [-/+itc] [-/+j] [-/+k8] [-kt keyboardtype]
[-/+l] [-/+lc] [-lcc path] [-leftbar] [-lf filename] [-/+ls] [-/+maximized]
[-/+mb] [-mc milliseconds] [-/+mesg] [-/+mk_width] [-ms color] [-n string]
[-name string] [-nb number] [-/+nul] [-/+pc] [-/+pob] [-report-colors]
[-report-fonts] [-rightbar] [-/+rv] [-/+rvc] [-/+rw] [-/+s] [-/+samename]
[-/+sb] [-selbg color] [-selfg color] [-/+sf] [-sh number] [-/+si] [-/+sk]
[-sl number] [-/+sm] [-/+sp] [-/+t] [-ti termid] [-title string]
[-tm string] [-tn name] [-/+u8] [-/+uc] [-/+ulc] [-/+ulit] [-/+ut] [-/+vb]
[-version] [-/+wc] [-/+wf] [-xrm resourcestring] [-ziconbeep percent]
Type xterm -help for a full description.
xinit: connection to X server lost
waiting for X server to shut down (II) Server terminated successfully (0). Closing log file.
Отредактировано Paranoia_Agent (Окт. 30, 2016 03:24:21)
Офлайн
Paranoia_Agent набери в консоли ‘startx’ и в окне xterm python3 my_script py
Онлайн
Выше написал с запуском из xterm, не успел отредактировать. Там почему-то вместо русской кодировки пробелы)
А startx почему-то пишет
[user@localhost ~]$ startx
xauth: file /home/user/.serverauth.3465 does not exist
/usr/libexec/Xorg.wrap: Only console users are allowed to run the X server
xinit: giving up
xinit: unable to connect to X server: Connection refused
xinit: server error
Не удалось получить файловый дескриптор, указывающий на консоль
Отредактировано Paranoia_Agent (Окт. 30, 2016 03:29:08)
Офлайн