【问题标题】:Confused on why I cannot add columnspan to this block of code without python assuming it should be a str instead of an int困惑为什么我不能在没有python的情况下将columnspan添加到这个代码块中,假设它应该是一个str而不是一个int
【发布时间】:2019-10-13 00:25:04
【问题描述】:

首先 - 非常感谢 @Bryan Oakley 在这里提供了一个很好的答案:[Creating a table look-a-like Tkinter 这让我开始着手解决我想做的事情。

目标:为我的 rogue-like 游戏创建一个简单的“角色表”。 (超级简单的基于文本的游戏),在我的 UI 中使用 Tkinter 中的 Grid Geometry。

过程:我想学习如何像表格一样创建网格并将统计信息放置在每个插槽中(现在我只是使用占位符字符串格式以方便参考来自 Bryan Oakley 之前的回答。)

问题:我尝试修改第 8、29 和 30 行以包含“columnspan”作为参数。 Columnspan 通常是一个参数,它可以在许多小部件中使用,以让一个项目占据更多“槽”。

原代码第8行没有6,第29行没有columnspan,第30行没有[columnspan]。

我尝试过的一些事情

  1. 我尝试注释掉第 25 行中的 for column in range 位以删除表的 weight=1 组件。这并没有给人留下任何深刻的印象(实际上代码在没有这个的情况下可以在其原始状态下工作。)

  2. 我尝试更改第 29 行中 columnspan, value 部分的顺序,因为我认为可能将 columnspan after 值放在导致问题的原因(实际上它确实导致了完全不同的问题.) 这就是为什么我现在在 值之前有列跨度。

  3. 我尝试在 set 方法中创建一个新行,以将 columnspan 作为配置添加到小部件。

# begin tkinter sample unit menu
import tkinter as tk

class ExampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        t = SimpleTable(self, 4, 6)
        t.pack(side="top", fill="x")
        t.set(0, 0, 6, "Hello, world")

class SimpleTable(tk.Frame):
    def __init__(self, parent, rows=4, columns=6):
        # use black background so it "peeks through" to
        # form grid lines
        tk.Frame.__init__(self, parent, background="black")
        self._widgets = []
        for row in range(rows):
            current_row = []
            for column in range(columns):
                label = tk.Label(self, text="%s/%s" % (row, column),
                                 borderwidth=0, width=10)
                label.grid(row=row, column=column, sticky="nsew", padx=1, pady=1)
                current_row.append(label)
            self._widgets.append(current_row)

        for column in range(columns):
            self.grid_columnconfigure(column, weight=1)


    def set(self, row, column, columnspan, value):
        widget = self._widgets[row][column][columnspan]
        widget.configure(text=value)

if __name__ == "__main__":
    app = ExampleApp()
    app.mainloop()

期望:我希望输出允许使用 columnspan 参数,从而使整个第一列成为单个块,在顶部显示“Hello, world”。

结果:我收到以下错误:

Traceback (most recent call last):

  File "tkintersampleunitmenu.py", line 35, in <module>
    app = ExampleApp()

  File "tkintersampleunitmenu.py", line 8, in __init__
    t.set(0, 0, 6, "Hello, world")

  File "tkintersampleunitmenu.py", line 31, in set
    widget = self._widgets[row][column][columnspan]
  File "/Users/#/anaconda3/lib/python3.6/tkinter/__init__.py", line 1486, in cget

return self.tk.call(self._w, 'cget', '-' + key)

***TypeError: must be str, not int***

我掌握(或者可能没有掌握)是 python 期望 columnspan 是一个字符串?但为什么?为什么它不寻找像行/列这样的整数?

【问题讨论】:

    标签: python python-3.x tkinter grid tk


    【解决方案1】:

    当您执行 widget[x] 时,tkinter 会将其视为 widget.cget(x)。您传入一个整数,而整数不是 cget 的正确参数,它需要小部件选项的名称(背景、边框宽度等)。

    【讨论】:

    • 好的 - 谢谢,这确实有助于澄清错误试图进入我的大脑。但是,您是如何让它接受您之前编写的参数中的整数参数的? IE。 0, 0,
    • @C.Michael:第一个和第二个数字(“0, 0”)是行和列,我将它们用作列表列表的索引。你也在做同样的事情,它工作得很好。不同之处在于您使用的是第三个整数并且您使用不正确。
    • 好的,谢谢。所以,显然我在错误的地方工作是我从中收集到的。回到修修补补。非常感谢您的澄清!
    猜你喜欢
    • 2021-04-17
    • 2020-03-02
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2010-09-05
    相关资源
    最近更新 更多