Latest posts on AboutBox в Tkinter topichttps://python.su/forum/topic/42211/2022-11-26T18:45:56+02:00Общий :: GUI :: AboutBox в Tkinter
2022-11-26T18:45:56+02:00xam1816225271<blockquote><em>ZIL130</em><br/>Не нашёл стандартного диалога “О приложении”</blockquote><div class="code"><pre>
<span class="kn">import</span> <span class="nn">tkinter</span> <span class="kn">as</span> <span class="nn">tk</span>
<span class="kn">from</span> <span class="nn">tkinter.messagebox</span> <span class="kn">import</span> <span class="n">showinfo</span>
<span class="n">root</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Tk</span><span class="p">()</span>
<span class="n">menu</span> <span class="o">=</span> <span class="n">tk</span><span class="o">.</span><span class="n">Menu</span><span class="p">()</span>
<span class="n">menu</span><span class="o">.</span><span class="n">add_command</span><span class="p">(</span><span class="n">label</span><span class="o">=</span><span class="s1">'about'</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="k">lambda</span> <span class="p">:</span> <span class="n">showinfo</span><span class="p">(</span><span class="s1">'о приложении'</span><span class="p">,</span> <span class="s1">' текст текст текст текст текст</span><span class="se">\n</span><span class="s1">'</span>
<span class="s1">' текст текст текст текст текст</span><span class="se">\n</span><span class="s1">'</span>
<span class="s1">' текст текст текст текст текст'</span><span class="p">))</span>
<span class="n">root</span><span class="o">.</span><span class="n">config</span><span class="p">(</span><span class="n">menu</span><span class="o">=</span><span class="n">menu</span><span class="p">)</span>
<span class="n">root</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>
Общий :: GUI :: AboutBox в Tkinter
2022-11-25T13:56:43+02:00ZIL130225242Не нашёл стандартного диалога “О приложении” в Tkinter, может быть и плохо искал, но то такое.<br/>В общем написал свой класс AboutBox.<br/>Это файл класса classAbout.py:<br/><div class="code"><pre> <span class="kn">from</span> <span class="nn">tkinter</span> <span class="kn">import</span><span class="o">*</span>
<span class="kn">from</span> <span class="nn">PIL</span> <span class="kn">import</span> <span class="n">Image</span><span class="p">,</span> <span class="n">ImageTk</span>
<span class="kn">import</span> <span class="nn">itertools</span>
<span class="kn">import</span> <span class="nn">webbrowser</span>
<span class="c1">#__author__ = Z.I.L.(З.И.Л.)</span>
<span class="k">class</span> <span class="nc">AboutBox</span><span class="p">(</span><span class="n">Toplevel</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">data_about</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">parent</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">'About'</span><span class="p">)</span> <span class="c1"># название окна напишите своё</span>
<span class="bp">self</span><span class="o">.</span><span class="n">geometry</span><span class="p">(</span><span class="s1">'350x250'</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">resizable</span><span class="p">(</span><span class="bp">False</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
<span class="n">adress</span> <span class="o">=</span> <span class="n">data_about</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="c1"># распаковываем данные</span>
<span class="n">file_path</span> <span class="o">=</span> <span class="n">data_about</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">link</span> <span class="o">=</span> <span class="n">data_about</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="n">author_text</span> <span class="o">=</span> <span class="n">data_about</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="n">license_text</span> <span class="o">=</span> <span class="n">data_about</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">toggle1</span><span class="p">():</span>
<span class="n">func</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">toggle_funcs1</span><span class="p">)</span> <span class="c1"># переключатель для кнопки Авторы</span>
<span class="n">func</span><span class="p">(</span><span class="n">label_author</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">toggle2</span><span class="p">():</span>
<span class="n">func</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">toggle_funcs2</span><span class="p">)</span> <span class="c1"># переключатель для кнопки Лицензии</span>
<span class="n">func</span><span class="p">(</span><span class="n">label_license</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">animate_forward</span><span class="p">(</span><span class="n">label_author</span><span class="p">):</span> <span class="c1"># анимация подъёма</span>
<span class="n">counter</span><span class="o">=</span><span class="mi">250</span>
<span class="k">def</span> <span class="nf">count</span><span class="p">():</span>
<span class="n">nonlocal</span> <span class="n">counter</span>
<span class="n">counter</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">counter</span> <span class="o">==</span><span class="mi">121</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">label_author</span><span class="o">.</span><span class="n">config</span><span class="p">(</span><span class="n">label_author</span><span class="o">.</span><span class="n">place</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">counter</span><span class="p">))</span>
<span class="n">label_author</span><span class="o">.</span><span class="n">after</span><span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="n">count</span><span class="p">)</span>
<span class="n">count</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">animate_back</span><span class="p">(</span><span class="n">label_author</span><span class="p">):</span> <span class="c1"># анимация сворачивания</span>
<span class="n">counter</span><span class="o">=</span><span class="mi">121</span>
<span class="k">def</span> <span class="nf">count</span><span class="p">():</span>
<span class="n">nonlocal</span> <span class="n">counter</span>
<span class="n">counter</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">counter</span> <span class="o">==</span><span class="mi">250</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">label_author</span><span class="o">.</span><span class="n">config</span><span class="p">(</span><span class="n">label_author</span><span class="o">.</span><span class="n">place</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">counter</span><span class="p">))</span>
<span class="n">label_author</span><span class="o">.</span><span class="n">after</span><span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="n">count</span><span class="p">)</span>
<span class="n">count</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">callback</span><span class="p">(</span><span class="n">event</span><span class="p">):</span>
<span class="k">if</span> <span class="n">adress</span> <span class="o">==</span> <span class="s2">""</span> <span class="ow">or</span> <span class="bp">None</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">webbrowser</span><span class="o">.</span><span class="n">open_new</span><span class="p">(</span><span class="n">adress</span><span class="p">)</span> <span class="c1"># адрес сайта приложения: adress="http(s)://www.%S.%S"</span>
<span class="n">picture</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="c1"># путь к файлу изображения: file_path="/path/to/filename"</span>
<span class="n">pict</span> <span class="o">=</span> <span class="n">picture</span><span class="o">.</span><span class="n">resize</span><span class="p">((</span><span class="mi">52</span><span class="p">,</span><span class="mi">52</span><span class="p">),</span> <span class="n">Image</span><span class="o">.</span><span class="n">ANTIALIAS</span><span class="p">)</span>
<span class="n">img</span> <span class="o">=</span> <span class="n">ImageTk</span><span class="o">.</span><span class="n">PhotoImage</span><span class="p">(</span><span class="n">pict</span><span class="p">)</span>
<span class="n">label_img</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fg</span> <span class="o">=</span> <span class="s1">'#FFDEAD'</span><span class="p">,</span> <span class="n">image</span> <span class="o">=</span> <span class="n">img</span><span class="p">)</span>
<span class="n">label_img</span><span class="o">.</span><span class="n">image</span> <span class="o">=</span> <span class="n">img</span>
<span class="n">label_img</span><span class="o">.</span><span class="n">place</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">149</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">52</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">52</span><span class="p">)</span>
<span class="n">label_link</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="n">link</span><span class="p">,</span> <span class="n">anchor</span><span class="o">=</span><span class="n">CENTER</span><span class="p">,</span> <span class="n">font</span><span class="o">=</span><span class="s2">"Verdana 10 underline"</span><span class="p">,</span> <span class="n">fg</span><span class="o">=</span><span class="s2">"#87CEEB"</span><span class="p">,</span> <span class="n">cursor</span><span class="o">=</span><span class="s2">"hand2"</span><span class="p">)</span>
<span class="n">label_link</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="n">underline</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span> <span class="c1"># имя сайта приложения/ссылка: link="%S.%S"</span>
<span class="n">label_link</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s2">"<Button-1>"</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
<span class="n">label_link</span><span class="o">.</span><span class="n">place</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">75</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">75</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">30</span><span class="p">)</span>
<span class="n">label_author</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span> <span class="o">=</span> <span class="n">author_text</span><span class="p">,</span> <span class="c1"># author_text="%S"</span>
<span class="n">anchor</span> <span class="o">=</span> <span class="n">N</span><span class="p">)</span>
<span class="n">label_author</span><span class="o">.</span><span class="n">place</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">250</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">350</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="n">toggle_funcs1</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">cycle</span><span class="p">((</span><span class="n">animate_forward</span><span class="p">,</span> <span class="n">animate_back</span><span class="p">))</span>
<span class="n">label_license</span> <span class="o">=</span> <span class="n">Label</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span> <span class="o">=</span> <span class="n">license_text</span><span class="p">,</span> <span class="c1">#license_text="%S"</span>
<span class="n">anchor</span> <span class="o">=</span> <span class="n">N</span><span class="p">)</span>
<span class="n">label_license</span><span class="o">.</span><span class="n">place</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">250</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">350</span><span class="p">,</span> <span class="n">height</span><span class="o">=</span><span class="mi">100</span><span class="p">)</span>
<span class="n">toggle_funcs2</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">cycle</span><span class="p">((</span><span class="n">animate_forward</span><span class="p">,</span> <span class="n">animate_back</span><span class="p">))</span>
<span class="n">btn_author</span> <span class="o">=</span> <span class="n">Button</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span> <span class="o">=</span> <span class="s1">'Авторы'</span><span class="p">,</span> <span class="n">command</span> <span class="o">=</span> <span class="n">toggle1</span><span class="p">)</span>
<span class="n">btn_author</span><span class="o">.</span><span class="n">place</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">15</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">220</span><span class="p">)</span>
<span class="n">btn_license</span> <span class="o">=</span> <span class="n">Button</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span> <span class="o">=</span> <span class="s1">'Лицензии'</span><span class="p">,</span> <span class="n">command</span> <span class="o">=</span> <span class="n">toggle2</span><span class="p">)</span>
<span class="n">btn_license</span><span class="o">.</span><span class="n">place</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">123</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">220</span><span class="p">)</span>
<span class="n">btn_close</span> <span class="o">=</span> <span class="n">Button</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span> <span class="o">=</span> <span class="s1">'Закрыть'</span><span class="p">)</span>
<span class="n">btn_close</span><span class="o">.</span><span class="n">place</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">247</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">220</span><span class="p">)</span>
<span class="n">btn_close</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="s1">'<Button-1>'</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">event</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">destroy</span><span class="p">())</span>
</pre></div>При этом основной файл приложения tk-AboutBox.py:<br/><div class="code"><pre> <span class="ch">#!/usr/bin/python3</span>
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="kn">from</span> <span class="nn">tkinter</span> <span class="kn">import</span><span class="o">*</span>
<span class="kn">from</span> <span class="nn">classAbout</span> <span class="kn">import</span> <span class="n">AboutBox</span>
<span class="k">class</span> <span class="nc">App</span><span class="p">(</span><span class="n">Tk</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="n">main_menu</span> <span class="o">=</span> <span class="n">Menu</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">config</span><span class="p">(</span><span class="n">menu</span><span class="o">=</span><span class="n">main_menu</span><span class="p">)</span>
<span class="n">info_menu</span> <span class="o">=</span> <span class="n">Menu</span><span class="p">(</span><span class="n">main_menu</span><span class="p">,</span> <span class="n">tearoff</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
<span class="n">main_menu</span><span class="o">.</span><span class="n">add_cascade</span><span class="p">(</span><span class="n">label</span> <span class="o">=</span> <span class="s1">'Инфо'</span><span class="p">,</span> <span class="n">menu</span><span class="o">=</span><span class="n">info_menu</span><span class="p">)</span>
<span class="n">info_menu</span><span class="o">.</span><span class="n">add_command</span><span class="p">(</span><span class="n">label</span> <span class="o">=</span> <span class="s1">'О программе'</span><span class="p">,</span> <span class="n">command</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">open_aboutbox</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">open_aboutbox</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">adress</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">""</span> <span class="c1"># или адрес или "", перед кавычками поставьте r</span>
<span class="n">file_path</span> <span class="o">=</span> <span class="s2">"python.png"</span> <span class="c1"># замените на путь к своему файлу изображения, если нет файла -""</span>
<span class="n">link</span> <span class="o">=</span> <span class="s2">"google.com"</span> <span class="c1"># ссылка на сайт приложения, если сайта нет оставьте пустые кавычки</span>
<span class="n">author_text</span> <span class="o">=</span> <span class="s2">"Авторы: Уася Пупкен, Куся Мусин, Муся Кусин."</span> <span class="c1"># сюда вписывайте авторов приложения</span>
<span class="n">license_text</span> <span class="o">=</span> <span class="s2">"Свободное распространение"</span> <span class="c1"># а сюда лицензию под которой выходит приложение</span>
<span class="bp">self</span><span class="o">.</span><span class="n">data_about</span> <span class="o">=</span><span class="p">(</span><span class="n">adress</span><span class="p">,</span><span class="n">file_path</span><span class="p">,</span><span class="n">link</span><span class="p">,</span><span class="n">author_text</span><span class="p">,</span><span class="n">license_text</span><span class="p">)</span>
<span class="n">about</span> <span class="o">=</span> <span class="n">AboutBox</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">data_about</span><span class="p">)</span>
<span class="n">about</span><span class="o">.</span><span class="n">grab_set</span><span class="p">()</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span> <span class="c1"># проверка импортируемый файл или нет</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">App</span><span class="p">()</span>
<span class="n">app</span><span class="o">.</span><span class="n">mainloop</span><span class="p">()</span>
</pre></div>Результат:<br/>Упс, не могу вставить gif.<br/>Попробуем ещё раз:<br/><img src="https://wampi.ru/image/R2C0BkI"></img><br/>Нет, гифки не идут никак.<br/>Ставим простую пээнгэ:<br/><img src="https://wampi.ru/image/R2C0oBP"></img>