seed.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import json
  2. import gradio as gr
  3. from modules import scripts, ui, errors
  4. from modules.infotext_utils import PasteField
  5. from modules.shared import cmd_opts
  6. from modules.ui_components import ToolButton
  7. from modules import infotext_utils
  8. class ScriptSeed(scripts.ScriptBuiltinUI):
  9. section = "seed"
  10. create_group = False
  11. def __init__(self):
  12. self.seed = None
  13. self.reuse_seed = None
  14. self.reuse_subseed = None
  15. def title(self):
  16. return "Seed"
  17. def show(self, is_img2img):
  18. return scripts.AlwaysVisible
  19. def ui(self, is_img2img):
  20. with gr.Row(elem_id=self.elem_id("seed_row")):
  21. if cmd_opts.use_textbox_seed:
  22. self.seed = gr.Textbox(label='Seed', value="", elem_id=self.elem_id("seed"), min_width=100)
  23. else:
  24. self.seed = gr.Number(label='Seed', value=-1, elem_id=self.elem_id("seed"), min_width=100, precision=0)
  25. random_seed = ToolButton(ui.random_symbol, elem_id=self.elem_id("random_seed"), tooltip="Set seed to -1, which will cause a new random number to be used every time")
  26. reuse_seed = ToolButton(ui.reuse_symbol, elem_id=self.elem_id("reuse_seed"), tooltip="Reuse seed from last generation, mostly useful if it was randomized")
  27. seed_checkbox = gr.Checkbox(label='Extra', elem_id=self.elem_id("subseed_show"), value=False)
  28. with gr.Group(visible=False, elem_id=self.elem_id("seed_extras")) as seed_extras:
  29. with gr.Row(elem_id=self.elem_id("subseed_row")):
  30. subseed = gr.Number(label='Variation seed', value=-1, elem_id=self.elem_id("subseed"), precision=0)
  31. random_subseed = ToolButton(ui.random_symbol, elem_id=self.elem_id("random_subseed"))
  32. reuse_subseed = ToolButton(ui.reuse_symbol, elem_id=self.elem_id("reuse_subseed"))
  33. subseed_strength = gr.Slider(label='Variation strength', value=0.0, minimum=0, maximum=1, step=0.01, elem_id=self.elem_id("subseed_strength"))
  34. with gr.Row(elem_id=self.elem_id("seed_resize_from_row")):
  35. seed_resize_from_w = gr.Slider(minimum=0, maximum=2048, step=8, label="Resize seed from width", value=0, elem_id=self.elem_id("seed_resize_from_w"))
  36. seed_resize_from_h = gr.Slider(minimum=0, maximum=2048, step=8, label="Resize seed from height", value=0, elem_id=self.elem_id("seed_resize_from_h"))
  37. random_seed.click(fn=None, _js="function(){setRandomSeed('" + self.elem_id("seed") + "')}", show_progress=False, inputs=[], outputs=[])
  38. random_subseed.click(fn=None, _js="function(){setRandomSeed('" + self.elem_id("subseed") + "')}", show_progress=False, inputs=[], outputs=[])
  39. seed_checkbox.change(lambda x: gr.update(visible=x), show_progress=False, inputs=[seed_checkbox], outputs=[seed_extras])
  40. self.infotext_fields = [
  41. PasteField(self.seed, "Seed", api="seed"),
  42. PasteField(seed_checkbox, lambda d: "Variation seed" in d or "Seed resize from-1" in d),
  43. PasteField(subseed, "Variation seed", api="subseed"),
  44. PasteField(subseed_strength, "Variation seed strength", api="subseed_strength"),
  45. PasteField(seed_resize_from_w, "Seed resize from-1", api="seed_resize_from_h"),
  46. PasteField(seed_resize_from_h, "Seed resize from-2", api="seed_resize_from_w"),
  47. ]
  48. self.on_after_component(lambda x: connect_reuse_seed(self.seed, reuse_seed, x.component, False), elem_id=f'generation_info_{self.tabname}')
  49. self.on_after_component(lambda x: connect_reuse_seed(subseed, reuse_subseed, x.component, True), elem_id=f'generation_info_{self.tabname}')
  50. return self.seed, seed_checkbox, subseed, subseed_strength, seed_resize_from_w, seed_resize_from_h
  51. def setup(self, p, seed, seed_checkbox, subseed, subseed_strength, seed_resize_from_w, seed_resize_from_h):
  52. p.seed = seed
  53. if seed_checkbox and subseed_strength > 0:
  54. p.subseed = subseed
  55. p.subseed_strength = subseed_strength
  56. if seed_checkbox and seed_resize_from_w > 0 and seed_resize_from_h > 0:
  57. p.seed_resize_from_w = seed_resize_from_w
  58. p.seed_resize_from_h = seed_resize_from_h
  59. def connect_reuse_seed(seed: gr.Number, reuse_seed: gr.Button, generation_info: gr.Textbox, is_subseed):
  60. """ Connects a 'reuse (sub)seed' button's click event so that it copies last used
  61. (sub)seed value from generation info the to the seed field. If copying subseed and subseed strength
  62. was 0, i.e. no variation seed was used, it copies the normal seed value instead."""
  63. def copy_seed(gen_info_string: str, index):
  64. res = -1
  65. try:
  66. gen_info = json.loads(gen_info_string)
  67. infotext = gen_info.get('infotexts')[index]
  68. gen_parameters = infotext_utils.parse_generation_parameters(infotext, [])
  69. res = int(gen_parameters.get('Variation seed' if is_subseed else 'Seed', -1))
  70. except Exception:
  71. if gen_info_string:
  72. errors.report(f"Error retrieving seed from generation info: {gen_info_string}", exc_info=True)
  73. return [res, gr.update()]
  74. reuse_seed.click(
  75. fn=copy_seed,
  76. _js="(x, y) => [x, selected_gallery_index()]",
  77. show_progress=False,
  78. inputs=[generation_info, seed],
  79. outputs=[seed, seed]
  80. )