【问题标题】:.pack ttk and sticky in Python 3.5Python 3.5 中的 .pack ttk 和粘性
【发布时间】:2015-10-09 23:23:06
【问题描述】:

我发现了如何为 Tk 创建一个替换徽标,以及如何从窗口中删除 Tk。然而,我还没有找到任何关于如何粘贴任何按钮等的存在。我尝试创建一个类和一个 def create_widget,但由于某种原因,我在 PyDev 调试中遇到错误。它一直说sticky = N + E是未定义的。我认为导入 ttk 会自动允许我通过 self 编辑这些按钮,但是当我这样做时,我必须更改周围的所有内容,然后导入将不允许 root。我相信这个问题是因为我没有以正确的方式导入,因为我已经替换了徽标并删除了 tk.我的问题是,.pack 是如何工作的,我在这段代码中主要缺少什么?

from tkinter import ttk
import tkinter
import tempfile

ICON =     (b'\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05\x00\x00'
    b'\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00'
    b'\x08\x00\x00\x00\x00\x00@\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    b'\x00\x01\x00\x00\x00\x01') + b'\x00'*1282 + b'\xff'*64

_, ICON_PATH = tempfile.mkstemp()
with open(ICON_PATH, 'wb') as icon_file:
    icon_file.write(ICON)


root = tkinter.Tk()

buttonstyle = ttk.Style()
buttonstyle.map("C.TButton",
    foreground=[('pressed', 'red'), ('active', 'blue')],
    background=[('pressed', '!disabled', 'black'), ('active', 'white')]
    )
colored_btn = ttk.Button(text="Activate", style="C.TButton").pack()

b = ttk.Button(root, text='Rename')
b.pack()

style = ttk.Style()


style.theme_settings("default", {
   "TCombobox": {
       "configure": {"padding": 5},
       "map": {
           "background": [("active", "green2"),
                          ("!disabled", "green4")],
           "fieldbackground": [("!disabled", "green3")],
           "foreground": [("focus", "OliveDrab1"),
                          ("!disabled", "OliveDrab2")]
       }
   }
})

combo = ttk.Combobox().pack()

style.layout("TMenubutton", [
   ("Menubutton.background", None),
   ("Menubutton.button", {"children":
       [("Menubutton.focus", {"children":
           [("Menubutton.padding", {"children":
               [("Menubutton.label", {"side": "left", "expand": 1})]
           })]
       })]
   }),
])

mbtn = ttk.Menubutton(text='Rename')
mbtn.pack()

root.title("Rename")
root.iconbitmap(default = ICON_PATH)

root.geometry("700x300")

label = ttk.Label(root, text = "Rename")
label.pack()

root.mainloop()

【问题讨论】:

  • 我查看过 Google、Python Doc 3.5 和 youtube。但是每个支持都没有说明如何在 .pack 上使用 .grid(row = ... )
  • “pack 是如何工作的”对于 stackoverflow 来说过于宽泛,而“如何在 .pack 上使用 .grid...”毫无意义。网格和打包是完成相同任务的两种不同方式。这就像烧烤对油炸,或者开车对开公共汽车。你不能“在油炸食品上烧烤”或“在公共汽车上开车”。您可能想先阅读effbot.org/zone/tkinter-geometry.htm

标签: python import tkinter sticky ttk


【解决方案1】:

看看你的导入:

from tkinter import ttk
import tkinter
import tempfile

现在查看据称失败的sticky 代码:

sticky = N + E

引用 NE(只是 'n''e')在 tkinter 中,因此您需要像访问该包中的其他对象一样访问它们,使用 tkinter.前缀:

sticky = tkinter.N + tkinter.E

或者只使用文字字符串:

sticky='ne'

【讨论】:

  • 你能在b = ttk.Button(root, text='Rename') b.pack()上给我看一个关于.grid(row =...看起来的描述)的例子吗?
  • @mydiax - 您是否同时使用 gridpack
  • 不太确定它的外观,我在这里使用相同的导入获得了替换徽标 Tk 的代码,然后转到 ttk。所以我去了 Python 3.5 Docs,它使用 .pack,所以我想我正在使用 .pack。我开始使用 Tkinter 以下教程并学习了如何 .grid 和创建类 Application(Frame) 和 root.mainloop,所以我知道如何使用常规 Tkinter,但不使用 ttk,我想说的是我不太确定如何处理 .pack 并且 Python Docs 在 ttk 中也没有说明任何内容。
  • 结合你上面关于“在包装上使用网格”的评论,这没有任何意义,听起来你需要在这里做一些重要的研究。我推荐docs on Effbot
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 2011-03-28
  • 2017-04-21
  • 1970-01-01
相关资源
最近更新 更多