Уведомления

Группа в Telegram: присоединиться

#1 Фев. 20, 2013 15:41:27

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

ttk notebook

Напрямую импортировать ttk не получается. Пишет ImportError: No madule named ‘ttk’
Получается только tkinter.ttk



Офлайн

#2 Фев. 20, 2013 16:17:55

Ubhra
От:
Зарегистрирован: 2009-03-04
Сообщения: 133
Репутация: +  2  -
Профиль   Отправить e-mail  

ttk notebook

Вот вычитал тут:
http://docs.python.org/dev/library/tkinter.ttk.html?highlight=ttk#using-ttk

Можете пояснить это?

To start using Ttk, import its module:
from tkinter import ttk

To override the basic Tk widgets, the import should follow the Tk import:
from tkinter import *
from tkinter.ttk import *



Офлайн

#3 Фев. 20, 2013 17:13:56

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

ttk notebook

Проблема здесь в том, что в tkinter и ttk есть виджет с одинаковым названием - frame. Как системе распозднать, какой виджет Вы имеете ввиду??
Я думаю нужно писать так…

# -*- coding: utf-8 -*-
import tkinter
from tkinter.ttk import*
mainframe = tkinter.Tk()
# use width x height + x_offset + y_offset (no spaces!)
mainframe_width = (mainframe.winfo_screenwidth() / 2 - 400)
mainframe_heigth = (mainframe.winfo_screenheight() / 2 - 250)
mainframe.geometry("%dx%d+%d+%d" % (800, 500, mainframe_width, mainframe_heigth))
mainframe.title('test')
n_book = Notebook(mainframe)
n_book.pack(fill='both', expand='yes')
# create a child frame for each page
style = Style()
style.configure("1.TFrame", background="red")
style.configure("2.TFrame", background="blue")
style.configure("3.TFrame", background="green")
frame_1 = Frame(mainframe, style="1.TFrame")
frame_2 = Frame(mainframe, style="2.TFrame")
frame_3 = Frame(mainframe, style="3.TFrame")
frame_1.pack()
frame_2.pack()
frame_3.pack()
# create the pages
n_book.add(frame_1, text='page1')
n_book.add(frame_2, text='page2')
n_book.add(frame_3, text='page3')
# put a button widget on child frame f1 on page1
btn1 = Button(frame_1, text='button1')
btn1.pack(side='left', anchor='nw', padx=3, pady=5)
mainframe.mainloop()



Офлайн

#4 Фев. 21, 2013 04:08:44

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 6456
Репутация: +  571  -
Профиль   Отправить e-mail  

ttk notebook

Ubhra
А может можно сразу все импортировать? Чтоб без всяких вылетов: не найден tk или tkinter и т.д.
засоряется пространство имён
прочитай import this



Офлайн

#5 Фев. 21, 2013 09:42:44

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

ttk notebook

Все просто. В Tk есть набор виджетов. В ttk есть набор виджетов. Оба набора имеют пересечение, то есть определение одних и тех же виджетов. Таким образом import * переопределяет имена классов, в зависимости от того что вы импортируете последним.

Теперь становится понятным почему пропадают свойства у кнопок и прочих элементов. Вы последним импортируете ttk, а в нем стили реализованы в своей философии, и все свойства определяющие стили Tk теперь вызывают ошибку.

Вам следует почитать про импорт, как рекомендуют выше, а так же почитать по Tkinter и ttk, и увидеть разницу между одноименными виджетами.

Последняя (известная мне) документация по Tkinter и ttk.



Отредактировано Griffon (Фев. 21, 2013 09:46:38)

Офлайн

#6 Фев. 21, 2013 13:55:09

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

ttk notebook

Griffon
Можно реализовать так как я писал выше:

import tkinter
from tkinter.ttk import*
В этом случае пересечений не будет, так как для вызова виджетов tkinter необходимо явно указывать имя модуля (т.е. tkinter.Button или tkinter.Frame), а для вызова методов ttk нужно их просто вызывать (извините, получилась товтология), т.е. (Buuton, Frame).
Либо действительно необходимо четко следить за импортированием. За это я не люблю инструкцию
from имя_модуля import* о чем уже не однократно писал.
Помню раньше, всем поголовно, в каждом посте по Tkinter рекомендовал не использовать инструкцию from Tkinter import* (быля у меня такая манечка) :)



Отредактировано 4kpt (Фев. 21, 2013 13:59:53)

Офлайн

#7 Окт. 23, 2017 03:26:57

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

ttk notebook

4kpt
Ну что, работает?
вот так работает в python 3.4.4, исправлен только импорт
 # -*- coding: utf-8 -*-
import tkinter
from tkinter import ttk
mainframe = tkinter.Tk()
# use width x height + x_offset + y_offset (no spaces!)
mainframe_width = (mainframe.winfo_screenwidth() / 2 - 200)
mainframe_heigth = (mainframe.winfo_screenheight() / 2 - 250)
mainframe.geometry("%dx%d+%d+%d" % (800, 600, mainframe_width, mainframe_heigth))
mainframe.title('test')
n_book = ttk.Notebook(mainframe)
n_book.pack(fill='both', expand='yes')
# create a child frame for each page
style = ttk.Style()
style.configure("1.TFrame", background="red")
style.configure("2.TFrame", background="blue")
style.configure("3.TFrame", background="green")
frame_1 = ttk.Frame(mainframe, style="1.TFrame")
frame_2 = ttk.Frame(mainframe, style="2.TFrame")
frame_3 = ttk.Frame(mainframe, style="3.TFrame")
frame_1.pack()
frame_2.pack()
frame_3.pack()
# create the pages
n_book.add(frame_1, text='page1')
n_book.add(frame_2, text='page2')
n_book.add(frame_3, text='page3')
# put a button widget on child frame f1 on page1
btn1 = ttk.Button(frame_1, text='button1')
btn1.pack(side='left', anchor='nw', padx=3, pady=5)
mainframe.mainloop()

Офлайн

#8 Авг. 1, 2019 21:36:07

ivikis
Зарегистрирован: 2019-08-01
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

ttk notebook

Как ярлычки вкладок (ttk notebook) разместить внизу?

Не то, что хотелось:
s = ttk.Style()
s.configure('TNotebook', tabposition='sw')

Отредактировано ivikis (Сен. 1, 2019 17:30:27)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version