seed.py 5.2 KB

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