python main函数中的变量可以在其他函数中使用嘛,main中的全局变量未在python的另一个函数中识别...

code below creates a layout and displays some text in the layout. Next the layout is displayed on the console screen using raw display module from urwid library. However running the code fails as a global variable ui, declared in main, is not recognised in another function.

Error code on running is :

Traceback (most recent call last):

File "./yamlUrwidUIPhase6.py", line 97, in

main()

File "./yamlUrwidUIPhase6.py", line 90, in main

form = FormDisplay()

File "./yamlUrwidUIPhase6.py", line 23, in __init__

palette = ui.register_palette([

NameError: global name 'ui' is not defined

The code :

import sys

sys.path.append('./lib')

import os

from pprint import pprint

import random

import urwid

global ui

class FormDisplay(object):

def __init__(self):

self.ui = urwid.raw_display.Screen()

palette = ui.register_palette([

('Field', 'dark green, bold', 'black'), # information fields, Search: etc.

('Info', 'dark green', 'black'), # information in fields

('Bg', 'black', 'black'), # screen background

('InfoFooterText', 'white', 'dark blue'), # footer text

('InfoFooterHotkey', 'dark cyan, bold', 'dark blue'), # hotkeys in footer text

('InfoFooter', 'black', 'dark blue'), # footer background

('InfoHeaderText', 'white, bold', 'dark blue'), # header text

('InfoHeader', 'black', 'dark blue'), # header background

('BigText', RandomColor(), 'black'), # main menu banner text

('GeneralInfo', 'brown', 'black'), # main menu text

('LastModifiedField', 'dark cyan, bold', 'black'), # Last modified:

('LastModifiedDate', 'dark cyan', 'black'), # info in Last modified:

('PopupMessageText', 'black', 'dark cyan'), # popup message text

('PopupMessageBg', 'black', 'dark cyan'), # popup message background

('SearchBoxHeaderText', 'light gray, bold', 'dark cyan'), # field names in the search box

('SearchBoxHeaderBg', 'black', 'dark cyan'), # field name background in the search box

('OnFocusBg', 'white', 'dark magenta') # background when a widget is focused

])

urwid.set_encoding('utf8')

def main(self):

#self.view = ui.run_wrapper(formLayout)

self.view = formLayout()

self.ui.start()

self.loop = urwid.MainLoop(self.view, self.palette, unhandled_input=self.unhandled_input)

self.loop.run()

def unhandled_input(self, key):

if key == 'f8':

quit()

return

def formLayout():

text1 = urwid.Text("Urwid 3DS Application program - F8 exits.")

text2 = urwid.Text("One mission accomplished")

textH = urwid.Text("topmost Pile text")

cols = urwid.Columns([text1,text2])

pile = urwid.Pile([textH,cols])

fill = urwid.Filler(pile)

textT = urwid.Text("Display")

textSH = urwid.Text("Pile text in Frame")

textF = urwid.Text("Good progress !")

frame = urwid.Frame(fill,header=urwid.Pile([textT,textSH]),footer=textF)

dim = ui.get_cols_rows()

ui.draw_screen(dim, frame.render(dim, True))

return

def RandomColor():

'''Pick a random color for the main menu text'''

listOfColors = ['dark red', 'dark green', 'brown', 'dark blue',

'dark magenta', 'dark cyan', 'light gray',

'dark gray', 'light red', 'light green', 'yellow',

'light blue', 'light magenta', 'light cyan', 'default']

color = listOfColors[random.randint(0, 14)]

return color

def main():

form = FormDisplay()

form.main()

########################################

##### MAIN ENTRY POINT

########################################

if __name__ == '__main__':

main()

I don't want to change the function formLayout as I intend to add more to this basic code framework, where in another function will be added that repeatedly calls formLayout to keep updating the screen based on reading values from a yml file.

解决方案

Writing global ui in main does nothing except make it so that main itself can write to a global variable called ui. If you want to write to that global variable from other functions (like your __init__), you need to include a global declaration there too. Every function where you want to assign to a global variable has to have its own global declaration.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值