Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » 1)Tkinter menubar delete 2)сборка мусора tkinter`ом [RSS Feed]

#1 Окт. 18, 2016 04:17:00

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

1)Tkinter menubar delete 2)сборка мусора tkinter`ом

Здравствуйте. Решил тут вспомнить питон и наткнулся на такую вещь:
Задача: нарисовать окно с меню, по нажатию клавиши переходить в полноэкранный режим и обратно. Для полноэкранного режима надо эту строку меню удалять.
Результат:
- 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()

Отредактировано Paranoia_Agent (Окт. 27, 2016 01:24:12)

Офлайн

#2 Окт. 27, 2016 01:48:34

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

1)Tkinter menubar delete 2)сборка мусора tkinter`ом

Подниму тему, так как дописал второй вопрос.

P.S. Надо было, наверное, новую тему создать, что-то я ступил…

Офлайн

#3 Окт. 27, 2016 16:56:13

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

1)Tkinter menubar delete 2)сборка мусора tkinter`ом

Насчет 1 вопроса Вам вряд-ли кто-то поможет.
2 вопрос. Вы уверены, что для удаления нужно передавать аргумент “all” и он правильно выполняется?

Офлайн

#4 Окт. 27, 2016 17:59:41

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

1)Tkinter menubar delete 2)сборка мусора tkinter`ом

Вы уверены, что для удаления нужно передавать аргумент “all” и он правильно выполняется?

Ну с экрана все элементы удаляются (по крайней мере их не видно).
Если написать:

 self.canvas.delete("circle")
то оперативку также ест. Причём чем больше элементов, тем больше ест, например в моей другой программе добавляется около 4 мегабайт за одно растягивание, что, я считаю, не приемлемо.

Отредактировано Paranoia_Agent (Окт. 27, 2016 18:00:59)

Офлайн

#5 Окт. 27, 2016 18:01:58

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

1)Tkinter menubar delete 2)сборка мусора tkinter`ом

С канвасом не работал. Попробуйте удалять объекты по id или тегу.

Офлайн

#6 Окт. 27, 2016 18:28:10

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

1)Tkinter menubar delete 2)сборка мусора tkinter`ом

 self.canvas.delete("circle")
Эмм, я вроде и так по тегу удаляю
По id попозже попробую.

Офлайн

#7 Окт. 27, 2016 19:49:01

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

1)Tkinter menubar delete 2)сборка мусора tkinter`ом

Paranoia_Agent по пункту 1 - зависит от ОС, оконного менеджера и т.д.
попробуйте запустить в чистых иксах из консоли

startx python myfile.py
по п2 - не работал с tk

Офлайн

#8 Окт. 30, 2016 03:13:59

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

1)Tkinter menubar delete 2)сборка мусора tkinter`ом

4kpt_IV
С канвасом не работал. Попробуйте удалять объекты по id или тегу.
Проверил, по id тоже не полностью удаляется.
vic57
Paranoia_Agent по пункту 1 - зависит от ОС, оконного менеджера и т.д. попробуйте запустить в чистых иксах из консоли
Я не очень силён в линуксе. От user`a пишет нет прав, от рута пишет, что не знает команды python3:
[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.

Если запускать через xterm, то тоже полоска есть:

Отредактировано Paranoia_Agent (Окт. 30, 2016 03:24:21)

Офлайн

#9 Окт. 30, 2016 03:23:48

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

1)Tkinter menubar delete 2)сборка мусора tkinter`ом

Paranoia_Agent набери в консоли ‘startx’ и в окне xterm python3 my_script py


Офлайн

#10 Окт. 30, 2016 03:28:31

Paranoia_Agent
Зарегистрирован: 2014-06-25
Сообщения: 75
Репутация: +  5  -
Профиль   Отправить e-mail  

1)Tkinter menubar delete 2)сборка мусора tkinter`ом

Выше написал с запуском из 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)

Офлайн

  • Начало
  • » GUI
  • » 1)Tkinter menubar delete 2)сборка мусора tkinter`ом[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version