【问题标题】:Seems like python is partial似乎python是部分的
【发布时间】:2011-09-14 20:39:21
【问题描述】:

下面是我创建的一个函数,放在一个叫last_function.py的文件中

from tkinter import*


def new_gui(app,sound_file,mixer):

    track=mixer.Sound(sound_file)
    def track_toggle():
        if ballCheckbutton.get()==1:

            track.play(loops=-1)
        else:
            track.stop()

    ballCheckbutton=IntVar()    
    c1=Checkbutton(app,text="check me out",command=track_toggle,variable=ballCheckbutton)
    c1.pack(side=LEFT)

    ballScale=DoubleVar()

    def ScaleVolume(v):
        track.set_volume(ballScale.get())

    ballScale.set(track.get_volume())
    s1=Scale(app,variable=ballScale,resolution=0.1,command=ScaleVolume,orient=HORIZONTAL,from_=0.0,to=1.0,label="volume")
    s1.pack()

这是我用来调用代码并运行它的文件..

from tkinter import *
import pygame.mixer
from last_function import*

app=Tk()
mixer=pygame.mixer
mixer.init()
new_gui(app,"49119_M_RED_HardBouncer.wav",mixer)


def close():
    mixer.stop()
    app.destroy()

app.protocol("WM_DELETE_WINDOW",close)
app.mainloop()

一切正常……但我的查询是……

1> 为什么我不能从 last_function 文件中删除 from tkinter import* .. 因为无论如何它在文件的顶部有那个正确的调用。为什么我收到一个错误提示 IntVar() 未定义。

2> 为什么我必须在函数中传递mixer 作为参数?函数不能直接从调用它的文件顶部的import pygame.mixer继承它吗?
我想说的是。还使用了 TKINTER 组件,但我没有将 TKINTER 作为参数传递.. 是吗!那为什么会有这个……选择性的参数赋值??

我真的很困惑!!!

【问题讨论】:

  • 请不要大喊大叫,即使你很困惑。
  • 这很可能是循环导入错误,表明某处存在设计缺陷。一般来说,您应该避免使用from x import *,除非您绝对必须使用它。它会混淆你的命名空间并且可以隐藏内置插件(例如from os import * 隐藏内置 open()。内置返回文件句柄,os.open 返回一个 int)。
  • @g.d.d.c- 这很有启发性,谢谢.. 从现在开始我将使用 FQN!
  • @g.d.d.c 不属于答案吗?
  • @truthreality - 可能,虽然我没有回答这个问题,但只是做了一个假设。我需要花更多时间来弄清楚它在哪里/是否实际上是一个循环导入错误。我只知道,当您只能通过from x import * 使某事工作时,这通常是问题所在。

标签: python


【解决方案1】:

1> 为什么我不能从 tkinter 中删除 从 last_function 文件导入*.. 因为无论如何它都在上面 调用它的文件 对。为什么我会收到一条错误消息 IntVar() 未定义

Python“导入”遵循与 Python 语言其他部分相同的范围规则。通过在第二个文件顶部的“导入”不会使 Tkinter 命名空间可用于 last_function.py 模块。 Tkinter 也需要在那里导入。

2>为什么我必须通过混音器作为 函数中的参数?可以 函数不直接从它继承 导入 pygame.mixer 文件调用它?我的意思 说是。有 TKINTER 组件 也被使用了,但我没有通过 将 TKINTER 作为参数.. 是吗!!然后 为什么会有这个..选择性 参数赋值??

按照您的编码方式,您需要通过混音器,因为您在第二个文件中修改它:

mixer.init()

如果您在 last_function.py 中重新导入了混音器,您将获得另一个混音器实例,而不是之前导入的实例。由于您的两个文件都导入了 Tkinter 命名空间,因此没有任何选择性。

您应该尝试重构此代码,以避免将 Tkinter 导入两个模块并在一个模块中初始化混音器并将其传递给另一个模块。

【讨论】:

  • @Mark-我认为你之前的解释更好(虽然有点复杂)但是..我明白了!谢谢..
猜你喜欢
  • 2016-06-05
  • 2016-07-06
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2023-03-06
  • 2015-02-06
  • 2016-12-30
相关资源
最近更新 更多