2015-06-11 7 views
4

Я на самом деле пытаюсь создать ttk.Spinbox от tkinter.Spinbox. Я могу манипулировать кодами ниже, например, ttk.Scrollbar. tkinter.Spinbox Кнопка дает старый взгляд на мой графический интерфейс, поэтому я хочу ttk.Spinbox.Создайте новый виджет ttk от tkinter

Редактировать: Я использую Python 3.4 на ОС Windows 7. Мне нужен тематический виджет Spinbox. ttk.__init__ файл не имеет класса Spinbox/модуля. Итак, я открываю этот файл и набираю коды так же, как Scrollbar класс, указанный ниже.

class Scrollbar(Widget, tkinter.Scrollbar): 
    """Ttk Scrollbar controls the viewport of a scrollable widget.""" 

    def __init__(self, master=None, **kw): 
     """Construct a Ttk Scrollbar with parent master. 

     STANDARD OPTIONS 

      class, cursor, style, takefocus 

     WIDGET-SPECIFIC OPTIONS 

      command, orient 
     """ 
     Widget.__init__(self, master, "ttk::scrollbar", kw) 

И коды, которые я разместил в файле ttk.__init__.py. Он наследует от tkinter.Spinbox.

class Spinbox(Widget, tkinter.Spinbox): 
    """spinbox widget.""" 
    def __init__(self, master=None, **kw): 
     Widget.__init__(self, master, "ttk::spinbox", kw) 

Результаты испытаний приведены ниже satisfactory.But есть отступ перед тем содержанием Spinbox Widget

tkinter.Spinbox Widget tkinter.Spinbox Widget

ttk.Spinbox Widget ttk.Spinbox Widget

Есть ли что-то не так? Почему возникает отступы?

import tkinter as tk 
import tkinter.ttk as ttk 

class Spinbox(ttk.Widget): 
    def __init__(self, master, **kw): 
     ttk.Widget.__init__(self, master, 'ttk::spinbox', kw) 

if __name__ == '__main__': 
    root = tk.Tk() 
    root.grid_columnconfigure(0, weight=1) 
    opts = { 'from_': 5, 'to': 10, 'increment': 1 } 
    sp1 = tk.Spinbox(root, from_=5, to=10) 
    sp1.grid(row=0, column=0) 
    sp2 = Spinbox(root, from_=5, to=10) 
    sp2.grid(row=1, column=0, columnspan=2, sticky="we",pady=2) 
    root.mainloop() 

Если развернуть корневой ОКНО ttk.Spinbox распространяется вместе с ним и отступы происходит. Я думаю, это связано с columnconfigure, но мне нужна конфигурация для лучшего внешнего вида.

+0

Ваш вопрос: «Что вы думаете о закодированных кодах»? Этот вопрос не имеет большого смысла и, вероятно, будет закрыт, поскольку он просит мнение. Кроме того, я действительно не понимаю, что означает «создать ttk.Spinbox из tkinter.Spinbox». Вы не можете создать один из другого. Во-первых, они оба уже существуют, поэтому нет причин создавать ttk.Spinbox. Вы спрашиваете, как подклассифицировать ttk.Spinbox? –

+0

Вы серьезно относитесь к тому, что ttk имеет модуль 'Spinbox'? Я попытался запустить коды перед встраиванием паттернов в файл 'ttk .__ init__' и получил сообщение об ошибке вроде этого: 'AttributeError: 'module' object не имеет атрибута 'Spinbox''. Я задал два вопроса. Во-первых, почему возникает отступ? И во-вторых, это правда, манипулируя оригинальным 'ttk .__ init__'? – Fatih1923

+0

Нет проблем. Вы можете сказать мне, как я могу получить пакет tcl/ttk в tkinter. Совместим ли он с python 3.4? – Fatih1923

ответ

3

Использование python 3.4 в Windows 7 Я не получаю такой же отступ. Вот демо:

import tkinter as tk 
import tkinter.ttk as ttk 

class Spinbox(ttk.Widget): 
    def __init__(self, master, **kw): 
     ttk.Widget.__init__(self, master, 'ttk::spinbox', kw) 

if __name__ == '__main__': 
    root = tk.Tk() 
    opts = { 'from': 0, 'to': 10, 'increment': 1 } 
    sp1 = tk.Spinbox(root, **opts) 
    sp1.place(x=5, y=5) 
    sp2 = Spinbox(root, **opts) 
    sp2.place(x=5, y=30) 
    root.mainloop() 

Это приводит к следующему:

screenshot of a tk spinbox and ttk spinbox

Если вы получаете дополнительный отступ в области ввода поля, возможно, вы форматированием значения с пробелами или символами табуляции.

+0

Вы правы. Ваши коды придают этому взгляду, но я еще не нашел ошибку на моей машине. Можете ли вы попробовать «из = 5» для начала? Всегда начинается с «0» любого номера вы пишете. – Fatih1923

4

Это, кажется, ошибка внутри самого Tk, и ваш код Python просто раскрывает его. Я преобразовал ваш пример кода в прямое Tcl/Tk и провел его как с Tk-8.5.17, так и с Tk-8.6.3 (через TclKits), и тот же вопрос, что там происходит, тоже:

package require Tk 8.5 

grid columnconfigure . 0 -weight 1 

spinbox .spin -from 5 -to 10 
grid .spin -row 0 -column 0 

ttk::spinbox .spin2 -from 5 -to 10 
grid .spin2 -row 1 -column 0 -sticky "ew" -pady 2 


Это то, что приведенный выше код выглядит при запуске:

ttk Spinbox bug present in Tcl/Tk itself


Оказывается, что код проблемы находится в файле vistaTheme.tcl в подкаталоге ttk, во вложенном коде, начинающемся с ttk::style layout TSpinbox:

ttk::style layout TSpinbox { 
    Spinbox.field -sticky nswe -children { 
     Spinbox.background -sticky news -children { 
      Spinbox.padding -sticky news -children { 
       Spinbox.innerbg -sticky news -children { 
        Spinbox.textarea -expand 1 -sticky {} 
       } 
      } 
      Spinbox.uparrow -side top -sticky ens 
      Spinbox.downarrow -side bottom -sticky ens 
     } 
    } 
} 


В частности, если вы удалите -sticky {} бит от Spinbox.textarea -expand 1 -sticky {} во внутреннем блоке-большинство, то это выглядит как отступы уходит:

Fixed Spinbox example in Tkinter


я предлагаю читать через ошибку Tcl/Tk wiki here, затем откройте ошибку с ними here по этому вопросу. Хотя бы не задерживать дыхание. Выпуски Tcl/Tk происходят не очень часто, потому что это довольно зрелый и стабильный язык. Если для Tcl/Tk создается исправление, вам нужно будет указать ошибку с поддерживающими Python, чтобы заставить их либо обновить внутреннюю копию Tcl/Tk для выпусков Windows, либо выполнить резервное копирование исправления.

Возможно, обойти проблему в Python можно с помощью стилей ttk и настройки бита Spinbox.textarea, чтобы отменить липкий атрибут, однако у меня нет точного фрагмента кода, который можно сделать в данный момент.

+1

Исправлено сейчас в Tk (http://core.tcl.tk/tk/info/f91b7065bf1bf655) после вашего расследования здесь. – patthoyts

+0

Awesome, спасибо!Я предполагаю, что кто-то должен получить ошибку, открытую на Python, чтобы получить это исправление, включенное, по крайней мере, в Python 3.x. Dunno, если они возьмут это для 2.x. – Kumba

Смежные вопросы